Nuxt结合Nginx部署疑问:dist目录与SSR配置及--standalone参数咨询
Nuxt SSR 部署方案详解
核心区别先搞懂
Nuxt SSR 不是纯静态站点,它需要 Node.js 服务动态渲染页面,这和 Vue CLI 构建的纯静态项目本质不同——后者的 dist 全是静态文件,直接扔给 Nginx 就能跑;但 Nuxt 构建后的 dist/server 是 Node 服务代码,必须先启动这个服务,再通过 Nginx 反向代理转发请求。
方案一:PM2 + Nginx 反向代理(最常用)
这是生产环境的标准部署方式,兼顾稳定性和性能:
- 构建与部署文件
在本地或 CI/CD 环境执行nuxt build生成dist目录,然后把整个项目(包括package.json、nuxt.config.js、dist、node_modules)传到服务器;如果是全新部署,记得在服务器上执行npm install安装依赖。 - 用 PM2 管理 Node 服务
PM2 可以保证服务持续运行,崩溃自动重启,执行命令:
这里的pm2 start npm --name "nuxt-ssr" -- run startstart是package.json里的脚本,默认 Nuxt 生成的脚本是"start": "nuxt start",会启动监听 3000 端口的 Node 服务。 - Nginx 反向代理配置
编辑 Nginx 配置文件(比如/etc/nginx/conf.d/nuxt.conf),把请求转发到 Node 服务,同时让 Nginx 直接处理静态资源减轻服务压力:
配置完后重启 Nginx:server { listen 80; server_name your-domain.com; # 主请求转发到 Node 服务 location / { proxy_pass http://localhost:3000; 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; } # 静态资源直接读取,缓存一年 location /_nuxt/ { alias /path/to/your/project/dist/client/_nuxt/; expires 1y; add_header Cache-Control "public, immutable"; } location /static/ { alias /path/to/your/project/dist/client/static/; expires 1y; add_header Cache-Control "public, immutable"; } }nginx -s reload
方案二:使用 --standalone 参数打包(无需服务器装依赖)
如果你不想在服务器上安装 node_modules,可以用 --standalone 参数让 Nuxt 把所有 Node 依赖打包进 dist/server 目录:
- 构建独立包
构建完成后,nuxt build --standalonedist/server会包含所有运行所需的依赖,无需额外安装。 - 部署与启动
只需要把dist目录传到服务器,然后用 Node 直接启动服务:
同样可以用 PM2 管理:node dist/server/index.jspm2 start dist/server/index.js --name "nuxt-ssr" - Nginx 配置
和方案一完全一致,静态资源依然指向dist/client下的对应目录。
为什么直接设置 Nginx 索引文件没用?
server 目录下的 index.ssr.html 只是渲染模板,不是最终的静态页面——SSR 页面需要 Node 服务根据请求动态填充数据、渲染组件后再输出 HTML,直接用 Nginx 访问这个模板文件只会得到空壳内容,必须通过 Node 服务处理请求才能得到完整页面。
额外注意事项
- 服务器 Node.js 版本要和本地构建环境尽量一致,避免依赖兼容问题;
- 用
--standalone打包时,构建环境的操作系统要和服务器一致(比如都是 Linux),否则部分二进制依赖可能无法正常运行; - PM2 可以设置开机自启:执行
pm2 startup生成开机脚本,再执行pm2 save保存当前服务状态。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

