做前端开发这么多年,从纯静态 Vue/React 项目,到现在主流的 Next.js 服务端渲染项目,最大的感受就是:页面写得再好,部署落地不稳,一切都是白搭。
静态项目部署简单,直接丢 Nginx 就行,但 Next 不一样。它兼顾了 SSR 服务端渲染、SSG 静态预渲染、API 接口路由,本质是一个Node.js 服务应用。如果直接裸跑、暴露端口,生产环境绝对扛不住。
最近刚完成公司新版官网的 Next 重构与上线,踩了不少代理、进程守护、静态资源缓存的坑。今天就以一线前端视角,完整复盘一套最稳定、企业通用的 Next 生产部署方案:Nginx 反向代理 + PM2 进程守护,包含完整流程、核心原理和实战避坑点,新手可直接照搬,老手可对照优化。
一、先讲明白:为什么 Next 必须这么部署?
很多刚接触 Next 的同学会疑惑:本地 npm run dev 跑得好好的,直接服务器 next start 启动不就行了?为什么还要额外装 PM2、配 Nginx?
这里说点实战真话:
1. Next 自带服务不适合裸奔上线
next start 启动的是原生 Node 服务,单线程、无崩溃重启机制、无连接优化、无法处理高并发,一旦遇到突发流量、代码轻微报错、内存溢出,服务直接挂掉,网站直接打不开。
2. 端口不能直接暴露公网
生产环境绝对不建议直接把 3000 端口对外开放,安全性极差,也无法配置 HTTPS、域名转发、限流防刷。
3. 动静分离性能最优
Next 打包后有大量静态资源(JS、CSS、字体、图片),这类资源交给专业的 Nginx 处理,比 Node 服务高效百倍,能极大减轻 Node 渲染压力。
所以我们最终的生产架构很清晰,也是目前行业标准方案:
用户浏览器 → Nginx(唯一公网入口) → 静态资源直接返回 / 动态请求转发给 Next 服务 → PM2 守护 Next 进程常驻运行
二、各角色实战定位(前端不用懂底层,但要懂分工)
不堆砌理论,只讲部署中真实起到的作用:
1. Next.js:核心业务服务
负责页面 SSR 服务端渲染、SSG 静态页面输出、项目 API 接口处理。打包后通过 next start 启动 Node 服务,默认监听本机 3000 端口,只对内提供服务,不对外暴露。
2. PM2:Node 进程管家
它不是服务器,不处理请求转发,只干一件事:管好 Next 进程。
实现进程崩溃自动重启、多核心负载均衡、日志收集、开机自启、平滑重启部署,彻底解决 Next 服务不稳定的问题。
3. Nginx:网关入口 + 静态服务器
承接所有公网请求,负责 HTTPS 解密、域名匹配、gzip 压缩、静态资源缓存、反向代理转发动态请求,是整个项目的安全屏障和性能优化核心。
三、完整部署实操流程(可直接复刻)
默认服务器已安装 Node、Git、Nginx、PM2,系统为 CentOS / Ubuntu 通用。
第一步:项目打包(服务器端)
本地开发完成后,切勿直接传源码上线,必须服务器打包(保证生产环境产物纯净):
# 安装依赖
npm install
# 生产打包
npm run build
这里重点提一嘴:Next 打包会根据页面渲染模式,生成不同产物,SSG 页面产出静态 HTML,SSR 页面保留动态渲染逻辑,打包后 .next 文件夹是核心生产产物。
打包完成后,先不要直接 next start,接下来交给 PM2 托管。
第二步:PM2 配置 Next 常驻进程
新手推荐直接用配置文件,比单行命令更稳定、方便后续维护。项目根目录新建 ecosystem.config.js:
module.exports = {
apps: [{
name: 'next-web',
script: 'node_modules/next/dist/bin/next',
args: 'start',
env: {
PORT: 3000,
NODE_ENV: 'production'
},
// 开启集群模式,利用多核CPU
instances: 'max',
exec_mode: 'cluster',
// 自动重启、最大内存限制
max_memory_restart: '1G',
restart_delay: 3000
}]
}
核心关键点:
- cluster 集群模式:解决 Node 单线程瓶颈,充分利用服务器多核 CPU,高并发场景必备;
- max_memory_restart:防止 Next 长期运行内存泄漏,超出阈值自动重启;
- 固定端口 3000,统一 Nginx 代理转发地址。
启动进程:
pm2 start ecosystem.config.js
pm2 save
pm2 startup
三条命令分别是:启动项目、保存进程列表、设置开机自启,彻底实现服务器断电重启后项目自动上线。
此时 Next 服务已经在 127.0.0.1:3000 稳定运行,仅本机可访问,安全且稳定。
第三步:Nginx 核心代理配置(重中之重)
Nginx 的核心逻辑就是动静分离:静态资源直接返回,不经过 Node;动态页面和接口转发给 Next 服务。
删除默认配置,新建站点配置,核心代码如下:
server {
listen 80;
server_name 你的域名;
# 开启gzip压缩,提升加载速度
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/x-javascript;
# Next静态资源:直接Nginx返回,长期缓存
location /_next/static/ {
alias /你的项目绝对路径/.next/static/;
expires 365d;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# 所有动态路由、API接口、SSR页面 反向代理到Next服务
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# 关键透传头部,解决线上各种bug
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;
# 支持WebSocket(部分Next实时功能必备)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
配置完成后,校验配置并重启 Nginx:
nginx -t
nginx -s reload
四、核心原理:一次请求的完整流转过程
很多人配置只会抄,但不懂原理,出问题就无从排查。这里用最通俗的话讲清楚一次用户请求的全过程:
1. 用户在浏览器输入域名,请求到达服务器 80 端口,由 Nginx 全权接收;
2. Nginx 做第一层判断:如果是 /_next/static/ 下的静态资源,直接读取服务器本地文件,加上长期缓存头返回浏览器,全程不经过 Next 和 PM2,速度极快;
3. 如果是普通页面、动态路由、/api 接口,Nginx 通过反向代理,把请求转发给本机 127.0.0.1:3000;
4. PM2 监控的 Next 进程接收请求,执行 React 组件渲染、接口逻辑,生成 HTML 或 JSON 响应;
5. 响应结果原路返回给 Nginx,再由 Nginx 返回用户浏览器。
五、上线必踩的坑(全是实战总结)
这次上线遇到的问题,全部整理出来,帮大家避坑:
1. 代理后 Next 获取不到真实用户 IP
原因:Nginx 转发请求时,默认不会携带用户真实信息,Next 拿到的永远是 127.0.0.1。
解决:必须配置 X-Real-IP、X-Forwarded-For 头部,这是生产环境必备配置,不能省略。
2. 配置 HTTPS 后,页面跳转、Cookie 异常
原因:Next 服务本身跑的是 HTTP,无法识别外网是 HTTPS,会误以为请求不安全。
解决:添加 X-Forwarded-Proto $scheme 头部,告诉 Next 当前真实请求协议。
3. 项目运行一段时间卡顿、内存飙升
原因:Node 存在内存泄漏风险,且默认单进程无法利用多核 CPU。
解决:PM2 开启 cluster 集群模式,配置 max_memory_restart 自动重启。
4. 静态资源缓存失效、页面更新不生效
原因:混淆了 Next 静态资源和页面缓存,/_next/static 带哈希后缀,可永久缓存,但页面本身不能设置长缓存。
5. 直接监听 0.0.0.0:3000 暴露公网
大忌!生产环境绝对禁止,会暴露 Node 服务漏洞,被恶意攻击、爬虫打挂服务。必须只监听本地回环地址,由 Nginx 统一代理。
六、项目迭代更新的上线流程
后续代码更新,无需重复配置,极简流程即可平滑上线、零停机:
# 拉取最新代码
git pull
# 重新打包
npm run build
# PM2平滑重启(不中断用户访问)
pm2 reload next-web
这里推荐用 pm2 reload 而不是 pm2 restart,reload 是平滑重启,会先启动新进程,再关闭旧进程,实现线上零宕机更新。
七、收尾总结
做前端久了越发觉得,部署能力也是前端的核心能力。只会写页面、不会落地部署,永远只能停留在初级阶段。
Next 项目的 Nginx+PM2 部署方案,本质就是各司其职:
- Nginx 做专业网关,扛流量、做缓存、保安全;
- PM2 做进程守护,解决 Node 服务不稳定的痛点;
- Next 专注业务渲染和接口逻辑。
这套架构稳定、轻量、零成本,适配绝大多数企业官网、中小型 Next 项目,完全可以作为前端生产部署的标准方案。