nginx对接node.js集群需围绕路由分发、连接透传、状态兼容、故障容错四环节配置:定义upstream服务组并设max_fails/fail_timeout健康检查;proxy_pass指向集群并透传host、x-real-ip、upgrade等头支持websocket;按业务选ip_hash(会话保持)、least_conn(长连接)或uri哈希;配置proxy_connect/send/read_timeout及proxy_next_upstream实现超时重试与自动容错。

要让 Nginx 稳定、高效地对接多个 Node.js 实例组成的集群,关键不是简单写几个 server,而是围绕路由分发、连接透传、状态兼容、故障容错四个核心环节做配置。下面直接讲实用要点。
定义 upstream 服务组并启用基础健康检查
在 http 块中声明后端集群,每个 Node.js 进程需监听独立端口(如 3001–3004),且已由 PM2 或 systemd 正常运行:
- 用
upstream node_cluster { ... }显式命名集群,便于后续引用 - 每行
server 127.0.0.1:3001 max_fails=2 fail_timeout=30s;表示该节点允许连续失败 2 次,30 秒内不参与分发 - 可加
weight=2调整权重(比如更高配机器多分流量),或backup标记备用节点
代理请求时保留客户端原始信息
Node.js 应用若依赖真实 IP 做限流、日志或鉴权,或使用 WebSocket,必须透传关键头字段:
-
proxy_pass http://node_cluster;—— 必须指向 upstream 名称,不能写死单个地址 -
proxy_set_header Host $host;—— 防止后端收到localhost导致重定向异常 -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;—— 获取真实来源 IP - WebSocket 支持必加:
proxy_http_version 1.1;+proxy_set_header Upgrade $http_upgrade;+proxy_set_header Connection "upgrade";
根据业务特性选合适的负载策略
默认轮询适合无状态 API;但若应用有内存级会话、本地缓存或依赖请求顺序,需切换策略:
-
ip_hash;—— 同一客户端 IP 始终打到同一 Node 实例(注意:经 CDN 或 NAT 后可能失效) -
least_conn;—— 分给当前活跃连接最少的节点,适合长连接(如聊天、SSE) -
hash $request_uri consistent;—— URI 一致性哈希,利于后端缓存命中,但需注意带参路径是否规范
设置超时与自动重试机制
避免单点卡顿拖垮整体响应,Nginx 层应主动兜底:
-
proxy_connect_timeout 5s;—— 建连超时,太短易误判,太长阻塞队列 -
proxy_send_timeout 30s;和proxy_read_timeout 30s;—— 数据传输阶段超时,匹配 Node.js 的处理预期 -
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;—— 出现这些情况时自动转发给下一个可用节点 - 建议搭配
proxy_next_upstream_tries 3;限制最多尝试次数,防雪崩











