nginx实现稳定负载转发的关键在于扎实的基础配置:合理定义upstream、精准选择匹配业务的算法(轮询/加权/least_conn/ip_hash)、配置健康兜底参数(max_fails/fail_timeout/backup/down)、精细控制连接复用与超时,并落实验证与可观测性。

要让 Nginx 实现稳定、可靠的负载转发,关键不是堆功能,而是把基础配置做扎实——重点在 upstream 定义合理、算法选得准、连接管理得当、故障能自动隔离。
明确后端服务特性,选对负载均衡算法
算法不是越复杂越好,匹配业务才是核心:
- 轮询(默认):适合后端服务器性能接近、服务无状态(如静态资源、REST API),配置最简,无需额外声明
-
加权轮询:新老机器混用、CPU/内存差异大时必用。比如一台 16C32G 服务器设
weight=5,一台 8C16G 设weight=2,Nginx 会按比例分发请求 - least_conn:长连接场景(WebSocket、gRPC、IM 推送)首选。它看的是“当前活跃连接数”,而非请求数,能真正避免某节点堆积数千连接而瘫痪
- ip_hash:仅在没有共享 Session 存储、又必须保持登录态时启用;注意 IPv4 / IPv6 兼容性及 NAT 环境下失效风险
upstream 配置要带健康兜底和容错参数
光写 server 10.0.0.1:8080 是脆弱的。稳定转发依赖主动探测与自动摘除:
- 加
max_fails=3 fail_timeout=30s:连续 3 次超时或 5xx 就标记为不可用,30 秒内不再转发请求 - 加
backup标记备用节点:主集群全挂时自动切流,不参与日常轮询 - 加
down手动下线:维护时直接加此标记,reload 即生效,无需删配置 - 避免裸 IP:建议用域名(如
app-v1.service.local),配合 DNS 轮询或 Service Mesh 做二级发现
代理层连接需精细控制,防止资源耗尽
转发不稳定常源于连接未复用或超时失配:
- HTTP 层启用 keepalive 复用:在 upstream 块中加
keepalive 32,并在 location 中设置proxy_http_version 1.1和proxy_set_header Connection '' - 四层 TCP 转发(如数据库、消息队列)用
stream模块,配proxy_timeout 600s防止空闲断连 - 统一设置超时:至少配置
proxy_connect_timeout(建连)、proxy_send_timeout(发数据)、proxy_read_timeout(收响应),三者宜阶梯递增,避免前端已断、后端还在等
验证与可观测性不能缺位
配置完不等于跑稳,必须有反馈闭环:
- 用
nginx -t检查语法,nginx -s reload平滑生效 - 访问
/status(需编译 http_stub_status_module)或通过 OpenResty + Prometheus 暴露指标:当前连接数、各 upstream 的请求计数、失败次数 - 模拟单点故障:手动停掉一台后端,观察 Nginx 是否 5 秒内停止转发、错误率是否归零、日志是否出现
upstream timed out或no live upstreams











