Nginx 不运行 Node.js,而是由 PM2 管理多实例集群并监听同一端口,Nginx 仅作反向代理和接入层;PM2 提供进程容错,Nginx 保障接入健壮性,二者协作实现高可用。

Nginx 本身不运行 Node.js,它只做反向代理和静态资源服务;真正实现 Node.js 高可用集群的核心是 PM2 的多进程管理能力,再由 Nginx 统一接入、分发请求。在 Windows(或 Linux)本地/生产环境里,这不是“Nginx 部署 Node.js”,而是「PM2 管理多个 Node.js 实例 + Nginx 反向代理到这些实例」的协作模式。
下面分三块讲清楚关键点和实操要点:
PM2 启动多实例集群
PM2 的 -i 参数直接启用集群模式,自动基于 Node.js 原生 cluster 模块创建多个工作进程,共享同一端口(比如 3000),无需你手动改代码或监听不同端口。
- 启动全部 CPU 核心数的实例:
pm2 start app.js -i max --name my-api - 指定 4 个实例:
pm2 start app.js -i 4 --name my-api - 查看进程状态:
pm2 list,你会看到多个id,但都指向同一个脚本,且状态为online - 单个进程崩溃时,PM2 自动拉起新进程,不影响整体服务——这是高可用的第一层保障
Nginx 反向代理到本地集群
Nginx 不需要知道后端是集群还是单例,它只管把请求转发到一个目标地址。由于 PM2 集群所有进程都监听同一端口(如 127.0.0.1:3000),Nginx 只需配置一个 upstream 或直接 proxy_pass 即可。
- 简单代理(推荐开发/单机场景):
location /api/ {
proxy_pass http://127.0.0.1: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;
}- 若想显式定义 upstream(便于未来扩展多机部署):
upstream node_backend {
server 127.0.0.1:3000; # 所有 PM2 工作进程共用此端口
}
location /api/ {
proxy_pass http://node_backend/;
...
}注意:这里不是负载均衡多个端口,而是 PM2 内部完成请求分发。Nginx 此时只起“统一入口”和“协议桥接”作用(如 HTTPS→HTTP、路径重写、静态文件直出)。
组合起来才真正高可用
单靠 PM2 或单靠 Nginx 都不够。两者的分工决定了稳定性边界:
-
PM2 负责进程级容错:崩溃重启、内存监控、日志聚合、热重载(
pm2 reload) - Nginx 负责接入层健壮性:抗连接风暴、缓存静态资源、隐藏真实端口、支持 HTTPS 和域名访问、防止恶意路径遍历
- 两者叠加后,即使某个 PM2 worker 挂掉,Nginx 仍能持续转发请求给其余存活进程;而 Nginx 本身轻量稳定,极少崩溃
- Windows 下建议用 PowerShell 启动 PM2(避免 CMD 编码/权限问题),Nginx 用官网 Windows 版解压即用,无需安装服务


















