部署完内存占用保持在 12GB 上下。如果要加上 Jenkins 之类持续集成的工具,保守估计服务器需要达到 16GB。你可以做一下限制内存的动作,比如限制 jvm 内存占用等。
项目演示地址:http://video-test.xn2001.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 配置文件中,一个静态网站部署(后台管理),两个反向代理(一个代理前台网站端口,一个代理后台网站端口)。
到这里部署就完成啦。
有志者事竟成!
阳光虽明码标价,但心中一团火不会熄灭。
版权属于:乐心湖's Blog
本文链接:https://www.xn2001.com/archives/638.html
声明:博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
3 comments
这将是一个大佬
快递代发,礼品代发快递单号上88单号网www.88danhw.com
讲师列表里面,点击修改的时候,浏览器地址跳转了http://localhost:9528/teacher/edit/1277161332654862338,但是页面是空白的。这是怎么回事?