nginx通过负载分发、连接复用、请求缓冲和健康兜底四大机制提升系统有效负载能力:轮询适用于同构无状态服务,加权轮询适配性能差异服务器,ip_hash保障会话一致性,least_conn优化长连接场景;启用keepalive、合理设置超时与缓冲、配置max_fails/fail_timeout及proxy_next_upstream实现健壮性。

选对调度策略,让流量分得匀
轮询(默认)适合同构无状态服务,但多数生产环境需要更精细的匹配:
- 后端性能不均(如新旧服务器混用)→ 改用加权轮询,例如
server 192.168.1.101 weight=5;和server 192.168.1.102 weight=2;,让流量按处理能力比例分配 - 用户登录态存在内存中 → 必须启用 ip_hash,保证同一 IP 始终落到同一台后端,避免会话丢失
- 长连接服务(如 WebSocket、gRPC 流)→ 切换为 least_conn,优先派发到当前活跃连接最少的节点,防堆积
- 严禁
ip_hash和weight同时使用,会导致策略冲突失效
复用连接,省掉反复建连开销
高频短连接下,TCP 握手/挥手占 CPU 和延迟大头。开启长连接可实测提升 QPS 35% 以上:
- 在
upstream块中加:keepalive 32;(每个 worker 缓存最多 32 条空闲连接) - 在
location中配:proxy_http_version 1.1;和proxy_set_header Connection ""; - 确保客户端也发
Connection: keep-alive头,否则 Nginx 的复用无效
设好缓冲与超时,别让慢请求拖垮整条链路
后端响应慢或卡住,会阻塞 Nginx 线程和连接池。合理缓冲+及时中断是保护后端的关键:
-
proxy_buffering on;+proxy_buffers 8 64k;:暂存后端响应体,释放其线程 -
proxy_read_timeout 30s;(而非默认 60s):及时切断挂起响应,回收资源 -
proxy_connect_timeout 5s;+proxy_send_timeout 30s;:快速失败,不等无效连接
配上健康检查,不让请求打向“假活”节点
没健康检查的负载均衡等于盲发。被动检查是开源版基础保障:
- 每台
server后加:max_fails=3 fail_timeout=30s;,30 秒内连续失败 3 次即临时摘除 - 搭配
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;,上游出错时自动重试下一台 - 若用 Nginx Plus 或 OpenResty,建议加主动健康检查:
health_check interval=5s uri=/health;,故障发现从分钟级缩至秒级











