部署完内存占用保持在 12GB 上下。如果要加上 Jenkins 之类持续集成的工具,保守估计服务器需要达到 16GB。你可以做一下限制内存的动作,比如限制 jvm 内存占用等。

项目演示地址:http://video-test.xn2001.com/

暂不公开后台管理界面的演示地址。

腾讯云镜像仓库:https://mirrors.cloud.tencent.com/

部署后端项目

后端模块较多,为了统一管理,我使用了 docker-compose 一键部署,但这同样需要大量的工作量,我们一一道来。

首先打包每个微服务模块的 jar 包,很多朋友打包都会出现问题,要么是失败,要么是无法运行,要么是没有资源文件,反正这些都是我踩过的坑。推荐 pom.xml 参考我 Github。

打包的话,在项目根模块,clean -> package 即可。然后把 jar 复制出来,每个 jar 包配合一个 Dockerfile

Dockerfile 内容基本一致,只需小改一下 jar 包名。两个例子:

api_gateway

FROM java:8
# 这里要修改成你的jar包名
ADD api_gateway-0.0.1-SNAPSHOT.jar app.jar
# 镜像要暴露的端口,此端口对于 docker run -p xx:xxx 后者的端口号
EXPOSE 9110
ENTRYPOINT ["java","-jar","app.jar","-Xms256m -Xmx256m"]

service_cms

FROM java:8
# 这里要修改成你的jar包名
ADD service_cms-0.0.1-SNAPSHOT.jar app.jar
# 镜像要暴露的端口,此端口对于 docker run -p xx:xxx 后者的端口号
EXPOSE 8140
ENTRYPOINT ["java","-jar","app.jar","-Xms256m -Xmx256m"]

然后把这些文件夹全部上传到服务器上。

接下来我们去搭建环境和 build 这些镜像。下面是完整的 docker-compose.yml

正确的食用方式:把内容全部复制出去,然后按需添加到服务器上,循序渐进从0到1启动一个 docker-compose。

例如:我先把 mysql 那一段加到服务器,启动 mysql 数据库,测试,导入 nacos 官方 sql 文件,然后再把 nacos 那一段加到服务器。

除了最基本的端口要修改为你实际的需求外,数据卷目录也应该适当根据需求修改。

mysql 容器启动后,需要导入 nacos 官方 sql 文件(官方找),才能正常启动 nacos。

nginx 主要用来做反向代理,也就是域名的绑定。

redis 配置文件需要自备,官方找,建议设置密码。

微服务模块我也加在了 docker-compose,实现一键生成镜像和启动容器,也方便后续管理。

version: "3"

networks:
  nginx_bridge:
    driver: bridge

services:
    #nginx主要用于反向代理
  nginxCollege:
    container_name: nginxCollege
    image: nginx
    restart: always
    ports:
      - 80:80
    privileged: true
    volumes:
      - /docker/nginxCollege/conf/proxy.conf:/etc/nginx/proxy.conf
      - /docker/nginxCollege/conf/nginx.conf:/etc/nginx/nginx.conf
      - /docker/nginxCollege/conf/conf.d/:/etc/nginx/conf.d/
      - /docker/nginxCollege/html/:/usr/share/nginx/html/
      - /docker/nginxCollege/logs/:/var/log/nginx/
    networks:
      - nginx_bridge
  #mysql数据库
  mysqlCollege:
    image: mysql:8.0
    container_name: mysqlCollege
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      - MYSQL_DATABASE=nacos
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - 39510:3306
    volumes:
      - /docker/mysqlCollege/logs:/logs
      - /docker/mysqlCollege/data:/var/lib/mysql
  nacosCollege:
    image: nacos/nacos-server
    container_name: nacosCollege
    restart: always
    depends_on:
      - mysqlCollege
    environment:
      PREFER_HOST_MODE: hostname #如果支持主机名可以使用hostname,否则使用ip,默认也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty
      MODE: standalone
      MYSQL_SERVICE_HOST: mysqlCollege #数据库地址,在这里可以直接写容器
      MYSQL_SERVICE_DB_NAME: nacos #数据库名
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: root #数据库管理账号
      MYSQL_SERVICE_PASSWORD: 123456 #数据库管理密码
      JVM_XMS: 512m
      JVM_MMS: 320m
    volumes:
      - /docker/nacosCollege/logs:/home/nacos/logs
    ports:
      - 39520:8848
  redisCollege:
    image: redis
    container_name: redisCollege
    restart: always
    ports:
      - 39530:6379
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /docker/redisCollege/data:/data
      - /docker/redisCollege/redis.conf:/usr/local/redis/redis.conf
      - /docker/redisCollege/logs:/logs
    command: ["redis-server", "/usr/local/redis/redis.conf"]
  api_gateway:
    restart: always
    build:
      context: ./jar/api_gateway #该jar和Dockerfile一起存放的目录
      dockerfile: Dockerfile #Dockerfile文件名
    container_name: api_gateway
    ports:
      - 39110:9110
    environment:
      - TZ=Asia/Shanghai
  service_mail:
    restart: always
    build:
      context: ./jar/service_mail #该jar和Dockerfile一起存放的目录
      dockerfile: Dockerfile #Dockerfile文件名
    container_name: service_mail
    ports:
      - 39111:8090
    environment:
      - TZ=Asia/Shanghai
  service_cms:
    restart: always
    build:
      context: ./jar/service_cms
      dockerfile: Dockerfile
    container_name: service_cms
    ports:
      - 39112:8140
    environment:
      - TZ=Asia/Shanghai
  service_edu:
    restart: always
    build:
      context: ./jar/service_edu
      dockerfile: Dockerfile
    container_name: service_edu
    ports:
      - 39113:8110
    environment:
      - TZ=Asia/Shanghai
  service_oss:
    restart: always
    build:
      context: ./jar/service_oss
      dockerfile: Dockerfile
    container_name: service_oss
    ports:
      - 39114:8120
    environment:
      - TZ=Asia/Shanghai
  service_sms:
    restart: always
    build:
      context: ./jar/service_sms
      dockerfile: Dockerfile
    container_name: service_sms
    ports:
      - 39115:8150
    environment:
      - TZ=Asia/Shanghai
  service_statistics:
    restart: always
    build:
      context: ./jar/service_statistics
      dockerfile: Dockerfile
    container_name: service_statistics
    ports:
      - 39116:8180
    environment:
      - TZ=Asia/Shanghai
  service_trade:
    restart: always
    build:
      context: ./jar/service_trade
      dockerfile: Dockerfile
    container_name: service_trade
    ports:
      - 39117:8170
    environment:
      - TZ=Asia/Shanghai
  service_ucenter:
    restart: always
    build:
      context: ./jar/service_ucenter
      dockerfile: Dockerfile
    container_name: service_ucenter
    ports:
      - 39118:8160
    environment:
      - TZ=Asia/Shanghai
  service_vod:
    restart: always
    build:
      context: ./jar/service_vod
      dockerfile: Dockerfile
    container_name: service_vod
    ports:
      - 39119:8130
    environment:
      - TZ=Asia/Shanghai

docker-compose 相关命令

docker-compose up -d 构建并启动所有容器

docker-compose up -d nginx 构建并启动 nginx 容器

docker-compose exec nginx bash 登录到 nginx 容器中

docker-compose down 删除所有nginx容器,镜像

docker-compose ps 显示所有容器

docker-compose restart nginx 重新启动 nginx 容器

docker-compose build nginx 构建 nginx 镜像

docker-compose logs nginx 查看 nginx 的日志

docker-compose logs -f nginx 查看 nginx 的实时日志

docker-compose pause nginx 暂停 nignx 容器

docker-compose unpause nginx 恢复 ningx 容器

docker-compose stop nginx 停止 nignx 容器

docker-compose start nginx 启动 nignx 容器

nginx.conf

worker_processes  1;

events {
  worker_connections  1024;
}

http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  keepalive_timeout  65;

  server {
    listen       80; #监听的端口
    server_name  video-test.xn2001.com; #域名或ip
    location / {
      proxy_pass http://ip:端口; #反向代理的地址
      index index.html; #配置首页
    }
  }
}

部署前端项目

部署之前介绍个东西,PM2,想要让项目托管在服务器中,使用 PM2 进行部署是将 Nuxt 应用程序托管在服务器或 VM 上的一个快速简便的解决方案。安装如下:

npm install pm2 -g

在项目根目录下添加一个文件:ecosystem.config.js,其中 name 和 mode 是可以修改的。

module.exports = {
  apps: [
    {
      name: 'site',
      exec_mode: 'fork_mode',
      script: './node_modules/nuxt/bin/nuxt.js',
      args: 'start'
    }
  ]
}

这里有本地编译和服务器编译两种方式,前者是你本地将 build 后的文件上传到服务器。后者是文件全部上传服务器,让服务器去 build。

前者方案,执行命令 npm run build,执行之后将 .nuxt, static, ecosystem.config.js, package.json, nuxt.config.js 上传到服务器。在服务器中进入该目录执行 npm install 以及 npm run start 测试是否正常。

各种奇葩错误,基本都是 node 或 npm 版本较低,百度升级方法,记得重连一下服务器才会生效。

一切都没问题,但是浏览器就是访问不了怎么办,检查防火墙,查看 nuxt.config.js 配置是否有欠缺。host: '0.0.0.0' 一定要加。

module.exports = {
  server: {
    port: 3001, // 线上端口
    host: '0.0.0.0'
  },
}

访问正常后,使用 pm2 做守护,保持网站的在线状态。直接使用 pm2 start 命令即可。

测试正常访问后,使用 Nginx 反向代理。(上面已经提及,就用 docker-compose 来启动 nginx,又快又省事。)

演示地址:http://video-test.xn2001.com/

接下来部署后台管理,直接打包出来是静态页面,放到 Nginx 容器即可。

命令:npm run build

将 dist 目录下所有文件丢到 Nginx 容器数据卷中。

也就是上图的 /docker/nginxCollege/html/ 下,当然这里我也是将 dist 改成 admin 再上传到服务器上。

在 nginx.conf 添加多一个 server

server {
  listen       xxx; #监听的端口
  server_name  域名; #域名或ip
  location / {    #访问路径配置
    root   /usr/share/nginx/html/admin;#根目录
    index  index.html index.htm; #默认首页
  }
  error_page   500 502 503 504  /50x.html;    #错误页面
  location = /50x.html {
    root   html;
  }
}

上面 listen: xxx 中端口号记得去 docker-compose.yml 中新增一个端口映射。

聪明的你会发现上面访问域名还得加端口号才能进后台管理,原因是我们域名同样默认端口为80,因此我们还是是要做反向代理:

server {
  listen       80; # 监听的端口
  server_name  域名; #域名或ip
  location / {
    proxy_pass http://xxx:xx; #反向代理的地址(ip+端口)
    index index.html; #配置首页
  }
}

当然也可以选择使用同个域名,然后根据目录来访问不同的网站。我的 Nginx 配置文件中,一个静态网站部署(后台管理),两个反向代理(一个代理前台网站端口,一个代理后台网站端口)。

到这里部署就完成啦。

有志者事竟成!

阳光虽明码标价,但心中一团火不会熄灭。


Last modification:September 28, 2021
如果觉得我的文章对你有用,请随意赞赏