服务器部署方案
服务器手动部署流程总结
对于记性不好的人来说,每次部署服务器都得重新查一遍部署流程,确实十分麻烦。在此我总结了一套部署流程,如果各位也想更省心地部署服务器,不妨参考一下,具体可以按照流程询问AI,这样准确率会大大提升。
本文介绍的是未使用 CI/CD 流水线的手动部署步骤。等站长再学习几天,可能会更新 CI/CD 流水线部署教程。
我尽可能把部署流程简化为首次部署和再次部署:尽量把大量工作放在首次部署中完成,这样再次部署时只需执行几条固定指令即可,甚至可以在 shell 中配置简单脚本,实现“一键部署”。
说明:文中命令里的路径、端口、服务名、
**等占位内容,请按实际环境替换。
Nginx 配置
这里只考虑使用简单的 conf 文件进行部署,不考虑拆分多个 conf 文件(毕竟个人网站通常懒得折腾)。
首次部署
重点在于 conf 文件如何编写。现在有 AI 辅助,只要把对应接口文档告诉 AI,就能生成一份很好用的配置。生成后直接覆盖原配置,然后校验并重载即可(详见“再次部署”)。
注意:如果是普通的 Vue 静态映射,可以使用如下结构:
nginx
location / {
alias /opt/ssjcode-admin/dist/;
index index.html;
# history 路由回退:刷新 /admin/article/edit/1 不能 404
try_files $uri $uri/ /admin/index.html;
}
如果是 Nuxt,则需要改为反向代理到 Node 端口:
nginx
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 开启:SSR 阶段后端返回慢一点时不要提前断开
proxy_read_timeout 60s;
}
再次部署
再次部署主要执行以下三条指令:
- 写好 conf 文件并覆盖到对应位置;
- 使用
nginx -t校验配置; - 使用
systemctl reload nginx重载配置。
shell
nginx -t
systemctl reload nginx
Vue 静态部署
这里只考虑 Vue 静态部署。
首次部署
为了做到一劳永逸,建议在构建项目骨架时,把所有与服务器相关的配置都写入环境文件(如 .env.production、.env.local)。Vue 会主动在对应环境加载不同的全局变量,这样每次打包时就不用到各处修改接口地址了。
下面提供一份 .env.production 供参考:
dotenv
VITE_API_BASE_URL='/api'
VITE_ACCESS_TOKEN='access-token'
VITE_REFRESH_TOKEN='refresh-token'
VITE_HOME='https://ssjcode.xyz'
配置好后,只需运行打包指令,然后把 dist 目录下的文件直接拖到对应位置即可:
shell
npm run build
再次部署
再次部署非常简单:打包后,直接把文件复制到对应位置即可。
Nuxt SSR 部署
Nuxt 相对复杂一些,因为涉及 SSR 渲染。这里简单讲一下原理,如果不感兴趣,可以直接跳到代码块部分。
Nuxt 的 SSR 原理,是在服务器与目标浏览器之间增加一个中间 Node 服务:浏览器对页面的请求先由 Node 中间服务完成渲染,再交给浏览器。通过这种方式,把客户端渲染改为服务端渲染,从而直接支持搜索引擎(SEO)友好,让网站更容易被其他人搜索到。
请求链路可以简单表示为:
text
Service -> Node -> Nuxt
因此,Nuxt 相比 Vue 多了一个启动或重启 Node 服务的过程。
首次部署
进行打包
shell
npm run build
将 .output 目录中的全部内容(不包含 .output 这一层目录)复制到服务器对应位置,可类比 Vue 的 dist 目录。
text
.output/
├── server/index.mjs ← 启动入口
├── server/chunks/** ← 服务端代码,文件名带 hash
├── public/** ← 静态资源(也要被 nginx 或 nitro 发出去)
└── node_modules/** ← 依赖已经打进来了
然后启动 Node 服务。先确定本机 Node 路径:
shell
which node
验证 Nuxt 是否可以正常启动(正常情况下一般不会有问题,这一步可以省略):
shell
cd /path/to/project && /usr/local/bin/node server/index.mjs
如果显示 Listening on http://127.0.0.1:<端口>,说明验证成功,之后退出进程即可。
编写 systemd unit 文件
这一步用于设置环境参数和故障自动重启,使服务在突然挂掉或内存溢出被杀死后可以自动重启。
ini
cat > /etc/systemd/system/nuxt-demo.service <<'EOF'
[Unit]
Description=Nuxt SSR 练习
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=项目地址
ExecStart=/usr/local/bin/node server/index.mjs
Environment=PORT=3001
Environment=NITRO_HOST=127.0.0.1
Environment=NUXT_API_BASE=http://127.0.0.1:8003
Restart=always
RestartSec=3
TimeoutStartSec=90
MemoryMax=256M
OOMScoreAdjust=-700
[Install]
WantedBy=multi-user.target
EOF
加载 unit 文件:
shell
systemd-analyze verify /etc/systemd/system/nuxt-demo.service # 检查
systemctl daemon-reload
systemctl list-unit-files | grep nuxt-demo
启动服务:
shell
systemctl start nuxt-demo.service
systemctl is-active nuxt-demo.service # 查看是否成功
再次部署
将再次打包后的文件覆盖服务器上原来的文件,然后重启服务即可:
shell
systemctl restart nuxt-demo
sleep 30
systemctl is-active nuxt-demo
后端部署(Spring Boot)
这里后端使用 Spring Boot。
首次部署
执行 clean package 构建:
shell
mvn clean package
把 jar 包放到对应目录下。
编写 systemd unit 文件
ini
cat > /etc/systemd/system/ssjcode-app.service <<'EOF'
[Unit]
Description=ssjcode backend
After=network-online.target mysqld.service
[Service]
WorkingDirectory=对应目录
ExecStart=/usr/lib/jvm/jdk-21.0.7+6/bin/java -Xms256m -Xmx512m -XX:+UseSerialGC -XX:MaxMetaspaceSize=192m \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=对应目录 \
-Duser.timezone=Asia/Shanghai \
-Dspringdoc.api-docs.enabled=false -Dspringdoc.swagger-ui.enabled=false -Dknife4j.enable=false \
-jar ./***.jar
Restart=always
RestartSec=10
OOMScoreAdjust=-700
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
然后启动服务:
shell
systemctl start ssjcode-app.service
再次部署
把 jar 包覆盖到对应位置后,执行重启:
shell
systemctl restart ssjcode-app
sleep 30
systemctl is-active ssjcode-app
常用指令字典
Nginx 常用指令
shell
systemctl restart nginx # 重启
systemctl status nginx # 查看状态
nginx -t # 先校验配置
systemctl reload nginx # 重载
systemctl stop nginx # 停止
systemctl start nginx # 启动
Linux 常用指令
shell
ps -ef | grep java # 查看 java 进程
kill <PID> # 关闭进程
