服务器部署方案

服务器部署方案

绅士君 绅士君 2026-10-23 74 技术

服务器手动部署流程总结

对于记性不好的人来说,每次部署服务器都得重新查一遍部署流程,确实十分麻烦。在此我总结了一套部署流程,如果各位也想更省心地部署服务器,不妨参考一下,具体可以按照流程询问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>                # 关闭进程

期待能留下你的脚印~

登录后即可发表评论~去登录
还没有评论,抢个沙发~

© 2026 绅士次元 · 个人博客

本网站一切内容不代表本站立场,并不代表本站赞成其观点和对其真实性负责。

如无意中侵犯了某个企业或个人知识产权,请及时通过电子邮件(3115355853@qq.com)告知我们,本网站将立刻给予删除。