Nuxt 项目部署前要先回答一个问题:你的页面是 SSR(服务端渲染)还是 SSG(静态生成)?这决定了服务器上要跑 Node 服务,还是只需要一个静态文件托管。选错路,配半天 Nginx 会发现根本对不上。

先定渲染模式
- SSG(
nuxt generate):构建时把页面全生成成静态 HTML。适合博客、文档、落地页——不需要买服务器,推到 Cloudflare Pages 这类静态托管就行(本站就是这么部署的)。 - SSR(
nuxt build):每次请求由 Node 服务实时渲染。适合需要登录态、个性化内容的动态应用,需要一台 VPS 跑 Node 进程。
看不懂?简单记:页面内容对所有人一样 → SSG;每人看到的不一样 → SSR。
SSR 部署流程

1. 服务器准备
先有一台配好基础环境的 VPS(参考 Vultr 新手上机指南),然后装 Node:
# 用 nvm 管理 Node 版本,和项目 .nvmrc 对齐
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
nvm install 20
Node 大版本要和本地开发时一致,大版本跨升最容易出灵异问题。
2. 构建并上传
# 本地
npm run build
把 .output/ 目录传到服务器(用 rsync 或 scp),同时带上 package.json(生产依赖用 npm ci --omit=dev 在服务器上装,避免把 devDependencies 传上去)。
3. 用 PM2 托管进程
npm i -g pm2
pm2 start .output/server/index.mjs --name nuxt-app
pm2 startup # 按提示做,开机自启
pm2 save
PM2 负责进程挂了自动重启。日志用 pm2 logs nuxt-app 看。
4. Nginx 反向代理 + HTTPS
server {
listen 80;
server_name 你的域名;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
HTTPS 按从零上线网站第 4 节用 certbot 一键签发。
日常更新流程
- 本地改完代码,跑一遍
npm run build确认能构建。 - 重新上传
.output/。 - 服务器上
pm2 reload nuxt-app(平滑重启,不断连接)。
建议把这三步写成一个 deploy 脚本,手动 scp 传文件传两次就会嫌烦。
上线前核对
- Node 大版本与本地一致。
- PM2 开机自启已配置(
pm2 startup+pm2 save)。 - 环境变量(API 地址、密钥)放在服务器的环境文件里,没进代码仓库。
- HTTPS 生效,
http301 跳转https。 - 按安全加固清单收紧过服务器。
Go 项目的话看这篇:把 Go 项目部署到 VPS。