Nuxt 4 使用 Nitro 引擎,生产环境 SSR 不能只上传静态文件,需要 Node 进程与 Nginx 反向代理配合。下面按原文给出的 CentOS/Ubuntu 流程,整理环境要求、PM2 环境变量、构建发布、Nginx 动静分离、自动化脚本以及常见故障排查。原文配置的关键点在于:PM2 负责运行 .output/server/index.mjs,Nginx 负责 /_nuxt/ 静态资源缓存、/api/ 转发和 SSR 回源;在 CentOS 上还要注意 SELinux 对本地端口连接的拦截。
一、环境要求
操作系统可以是 Ubuntu 20.04+、CentOS 7+ 或 Debian 11+;Node.js 要求 >= 20.10.0,因为 Nuxt 4 强依赖高版本 Node;Nginx 要求 >= 1.18;PM2 用于 Node.js 进程管理。硬件建议内存 >= 2GB,磁盘 >= 10GB 可用空间。部署前先确认这些版本,尤其是 Node.js 版本和 Nginx 是否已安装。
二、环境变量与 PM2 配置
Nuxt 4 默认使用 Nitro。部署前要区分 SSR 端调用和浏览器端调用。原文推荐在项目根目录创建或编辑 ecosystem.config.cjs,通过环境变量注入配置。其中 NUXT_PUBLIC_API_BASE 对应代码中的 useRuntimeConfig().public.apiBase,用于 SSR 模式下服务器访问后端接口的基准地址。
- module.exports = {
- apps: [{
- name: 'nuxt-app',
- port: 3000,
- host: '127.0.0.1',
- script: './.output/server/index.mjs',
- exec_mode: 'cluster', // 开启集群模式
- instances: 'max', // 根据 CPU 核心数启动实例
- env: {
- NODE_ENV: 'production',
- // SSR 模式下服务器访问后端接口的基准地址
- NUXT_PUBLIC_API_BASE: 'https://api.yourdomain.com',
- }
- }]
- }
复制代码
这里的 script 指向 Nitro 构建后的服务端入口,exec_mode 使用 cluster,instances 设为 max 可按 CPU 核心数启动实例。
三、构建、上传与启动
先在本地开发机执行构建,确保构建产物是最新的,然后压缩 .output 和 PM2 配置文件,减少传输时间。
- # 构建 Nuxt 4 项目
- pnpm build
- # 压缩打包产物
- tar -czf release.tar.gz .output ecosystem.config.cjs
复制代码
将压缩包上传到服务器 /var/www/nuxt-app 目录,可以通过 scp 上传,登录服务器后解压。
- # 示例:使用 scp 上传
- scp release.tar.gz user@your-server-ip:/var/www/nuxt-app/
- # 登录服务器解压
- cd /var/www/nuxt-app
- tar -xzf release.tar.gz
复制代码
首次部署需要全局安装 PM2 并启动应用,然后设置开机自启并保存进程列表。
- # 全局安装 PM2
- npm install -g pm2
- # 启动应用
- pm2 start ecosystem.config.cjs
- # 设置开机自启
- pm2 startup
- pm2 save
复制代码
四、Nginx 核心配置
在 CentOS/Ubuntu 上建议创建独立配置文件 /etc/nginx/conf.d/nuxt.conf。原文配置实现了动静分离和 API 转发:/_nuxt/ 下的 JS/CSS 由 Nginx 直接响应并设置长期缓存;/api/ 转发到真实后端,解决浏览器端访问时的跨域问题;主入口先尝试读取 public 下的静态文件,读不到再交给 SSR 渲染出口。
- # 定义 Node 应用的上游
- upstream nuxt_backend {
- server 127.0.0.1:3000;
- keepalive 64;
- }
- server {
- listen 80;
- server_name yourdomain.com; # 换成实际域名
- # 1. 静态资源直接由 Nginx 响应 (提升性能)
- # 对应 Nuxt 打包后的 JS/CSS
- location /_nuxt/ {
- alias /var/www/nuxt-app/.output/public/_nuxt/;
- expires 365d;
- add_header Cache-Control "public, max-age=31536000, immutable";
- access_log off;
- }
- # 2. 业务 API 转发
- # 解决浏览器端访问 /api 时的跨域问题
- location /api/ {
- proxy_pass http://api.internal-server.com/; # 转发到真实后端
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- # 3. 主程序入口
- location / {
- # 尝试直接读取 public 下的静态文件 (favicon.ico 等)
- root /var/www/nuxt-app/.output/public;
- try_files $uri $uri/ @ssr;
- }
- # 4. SSR 渲染出口
- location @ssr {
- proxy_pass http://nuxt_backend;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_cache_bypass $http_upgrade;
- client_max_body_size 20m;
- }
- }
复制代码
这段配置里,upstream 使用 keepalive 64 维护到 Node 的连接;/_nuxt/ 使用 alias 指向构建后的静态目录,并用 immutable 和一年过期时间降低重复请求;@ssr 使用 HTTP/1.1 并带上 Upgrade 相关头,同时设置 client_max_body_size 20m,适合有上传或较大请求体的场景。
五、自动化更新脚本
原文在本地根目录准备 deploy.sh,实现构建、打包、上传、解压和重启的一键发布。脚本中的 SERVER_USER、SERVER_IP、DEPLOY_PATH 需要按实际环境修改,pm2 reload nuxt-app 对应 ecosystem 配置里的应用名。
- #!/bin/bash
- # 配置项
- SERVER_USER="root"
- SERVER_IP="1.2.3.4"
- DEPLOY_PATH="/var/www/nuxt-app"
- echo "🚀 开始构建..."
- pnpm build
- echo "📦 正在打包..."
- tar -czf release.tar.gz .output ecosystem.config.cjs
- echo "📤 上传服务器..."
- scp release.tar.gz $SERVER_USER@$SERVER_IP:$DEPLOY_PATH
- echo "🔄 重启服务..."
- ssh $SERVER_USER@$SERVER_IP "cd $DEPLOY_PATH && tar -xzf release.tar.gz && pm2 reload nuxt-app"
- echo "✨ 部署完成!"
复制代码
六、CentOS 常见故障排查
1. Nginx 502 错误。CentOS 上 SELinux 默认可能禁止 Nginx 连接本地端口,可以先检查 httpd_can_network_connect,再开启权限。
- # 检查是否因为权限被拦
- sudo getsebool httpd_can_network_connect
- # 开启权限
- sudo setsebool -P httpd_can_network_connect 1
复制代码
2. 静态资源 403 Forbidden。需要确保 Nginx 用户(通常是 nginx 或 www-data)对项目目录有读取权限。
- sudo chmod -R 755 /var/www/nuxt-app
复制代码
3. PM2 日志查看。应用运行不正常时,通过日志定位问题。
- pm2 logs nuxt-app --lines 100
复制代码
七、HTTPS 配置与目录结构
使用 Certbot 为 Nginx 配置 HTTPS,原文给出 CentOS 下的安装和签发命令。
- sudo dnf install certbot python3-certbot-nginx
- sudo certbot --nginx -d yourdomain.com
复制代码
部署后的目录结构可参考如下:.output 下包含 server 和 public,server 是 Nitro Server 逻辑,public 是浏览器访问的静态文件;ecosystem.config.cjs 是 PM2 配置;release.tar.gz 是传输包或备份包。
- /var/www/nuxt-app/
- ├── .output/ # 构建产物 (SSR 入口 & 静态资源)
- │ ├── server/ # Nitro Server 逻辑
- │ └── public/ # 浏览器访问的静态文件
- ├── ecosystem.config.cjs # PM2 配置文件
- └── release.tar.gz # 备份/传输包
复制代码
整体来看,Nuxt 4 生产部署要核对 Node.js 版本、.output 路径、PM2 应用名、Nginx upstream 端口 3000,以及 CentOS 下的 SELinux 和目录权限。静态资源交给 Nginx 缓存、API 单独转发、SSR 回源到本地 Node 进程,这种分工能降低 Node 压力,也便于后续排错和自动发布。 |