上线项目的3种方式
环境准备
注意:使用哪种方式上线,就准备对应需要的环境
方式一、使用常规方式上线
Nginx
和jdk
的安装与配置
Nginx安装配置的参考链接:https://zhuanlan.zhihu.com/p/4257907691
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29# nginx 默认配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 使用yum来安装jdk,免配置环境变量
yum install -y java-1.8.0-openjdk*
方式二、使用宝塔面板上线
首先,直接建议打一个快照,标记这是安装宝塔面板之前的快照,便于我们重装系统
方式三、使用Docker
容器上线
Docker
的安装与配置
参考链接:https://www.51cto.com/article/715012.html1
2
3
4
5
6
7
8
9
10
11
12
13# 打开配置文件
vi /etc/docker/daemon.json
# 原来的配置
{
"registry-mirrors": ["https://y5u7p3c7.mirror.aliyuncs.com"]
}
# 换用下面的配置,目前2024.08.18可用
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
常见问题
1、需要更换yum源。参考链接:https://blog.csdn.net/qq_52545155/article/details/137229782
前端部署
普通上线
1、上传前端打包好的dist
文件夹到服务器
一般都是直接使用本地的打包好的
dist
文件夹,如果想在服务器进行打包,可以使用npm run build
命令,但是前提是需要在服务器进行安装node
和npm
,可以参考这篇文章。专业安装NVM教程(链接待补充)
2、配置Nginx
1 | # 首先进入 nginx 的配置文件目录 |
跨域解决:
1 | location ^~ /api/ { |
3、重启Nginx
1 | nginx -s reload |
4、检查防火墙以及安全组是否开放端口,然后测试访问
宝塔面板
1、打开软件商店
安装必须的环境:jdk
、nginx
、mysql
等
2、打开网站
菜单,添加站点
3、进入站点目录,上传打包好的前端dist
4、测试访问(有需要的话,可以手动配置nginx的配置文件)
Docker容器
1、在服务器的根目录下创建一个services
文件夹,然后创建对应的项目文件夹
2、使用git
拉取后端项目源码,或者直接打包上传
3、在当前前端项目的根目录,创建一个Dockerfile
文件,内容如下:
1 | FROM nginx |
4、在前端项目根目录创建一个docker
文件夹,然后创建一个nginx.conf
配置文件
1 | server { |
5、使用docker build
命令构建镜像并运行
1 | docker build -t smartapi-frontend . |
6、测试访问
后端部署
普通上线
1、在本地使用Maven
打jar
包,或者在服务器使用git
拉取源码,然后使用Maven命令打包
1 | mvn clean package -Dmaven.test.skip=true |
2、上传打包好的jar
包到服务器
3、运行 jar 包,启动命令如下:
1 | # 先以直观的模式启动 |
宝塔面板
1、打开文件
菜单,在www/wwwroot
目录下创建一个services
目录,再创建一个后端项目名字的文件夹,然后上传打包好的jar
包到该目录下
2、打开网站
文件夹
1 | # 项目的执行命令 |
3、测试是否启动成功
Docker容器
1、个人习惯在服务器的根目录下创建一个services
文件夹,然后创建对应的项目文件夹
2、使用git拉取后端项目源码,或者直接打包上传
3、在当前项目根目录编写DockerFile
1 | FROM maven:3.5-jdk-8-alpine as builder |
3、使用docker build
命令构建镜像并运行
1 | docker build -t user-center-backend:latest . |
4、测试是否启动成功
场景模拟
场景一:多war
包部署
场景描述
在不影响服务器上正常运行的基础上,将多个war
包部署到同一个服务器上,并使用nginx
进行负载均衡。
解决方案
1、使用Docker:
- 使用
docker
创建多个tomcat
容器,分别部署多个war
包,并使用nginx
进行负载均衡。
2、不使用Docker:
首先,复制一份tomcat
进入到 tomcat 的目录下, 将其中的 webapps 文件夹进行一份拷贝, 用于第二个应用的部署
进入到 tomcat 的服务配置文件下面, 打开 server.xml 配置文件, 填充第二个应用部署时的相关配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<!-- 第二个项目配置 -->
<Service name="Catalina1">
<!-- 为避免冲突, 修改端口 -->
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Tomcat默认使用8009端口, 避免冲突, 修改 -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>
<!-- Engine 节点, name 修改为 Catalina1 -->
<!-- 服务启动后会在 conf 下生成相应的引擎文件夹, 名称保持一致. -->
<Engine name="Catalina1" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 修改Host节点,appBase修改为需要进行发布的文件位置, 也就是第一步复制的 webapps1 -->
<Host name="localhost" appBase="webapps1"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>配置nginx负载均衡,记得
nginx -s reload
脚本启动tomcat,记得
start.sh
场景二:域名https访问
- 首先前端请求路径的baseurl改为
https://hostname.com
- 在nginx配置文件中添加如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72# 定义 HTTP 服务器,重定向到 HTTPS
server {
listen 80;
server_name hostname.com; # 服务器名称
return 301 https://$server_name$request_uri; # 永久重定向到 HTTPS
}
# 定义 HTTPS 服务器
server {
listen 443 ssl; # 监听 443 端口,启用 SSL
server_name hostname.com; # 服务器名称
# SSL 证书路径
ssl_certificate /path/to/cert/*.pem;
ssl_certificate_key /path/to/cert/*.key;
# SSL 会话缓存和超时时间
ssl_session_timeout 5m;
# SSL 密码套件和协议
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3; # 推荐使用 TLSv1.2 和 TLSv1.3
ssl_prefer_server_ciphers on;
# 静态文件请求处理
location / {
root html/frontend; # nginx目录的相对路径
index index.html index.htm; # 默认索引文件
try_files $uri $uri/ /index.html; # 尝试按顺序查找文件
}
# API 请求反向代理
location ^~ /api/ {
proxy_set_header X-Real-IP $remote_addr; # 设置真实的客户端 IP
proxy_set_header Host $host; # 设置主机头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置转发的客户端 IP
proxy_set_header X-Forwarded-Proto $scheme; # 设置转发的协议
proxy_pass http://127.0.0.1:3000/api/; # 反向代理到后端服务
}
# 其他请求反向代理
location @backend {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:3000; # 反向代理到后端服务
}
# 错误页配置
error_page 404 /404.html; # 自定义 404 错误页面
error_page 502 /502.html; # 自定义 502 错误页面
# 禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404; # 返回 404 错误
}
# 禁止在证书验证目录放入敏感文件
if ($uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$") {
return 403; # 返回 403 错误
}
# 设置静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|ttf|woff|woff2|eot|otf|pdf|mp4|webm|ogg|mp3|wav|flac|swf|xml|txt|csv|json)$ {
expires 30d; # 设置过期时间为 30 天
add_header Cache-Control "public, no-transform"; # 设置缓存控制头
}
# 设置访问日志和错误日志
access_log /www/wwwlogs/hostname.com.log; # 访问日志路径
error_log /www/wwwlogs/hostname.com.error.log; # 错误日志路径
}
场景三:不用反向代理的兜底方案
pm2是什么:
PM2是一个进程管理工具,用于管理Node.js应用程序,它提供了许多功能,如自动重启、负载均衡、日志记录等。
使用pm2来托管 vue 项目:
1 | # 安装pm2 |