Nginx默认轮询需配合健康检查、连接复用和故障恢复才能实现高可用:通过max_fails/fail_timeout剔除异常节点,keepalive复用连接降低开销,least_conn或proxy_next_upstream缓解响应不均,backup提供兜底容灾。
Nginx 轮询负载均衡本身简单可靠,但“默认轮询”不等于“开箱即用的高可用”。真正保障性能的关键,在于围绕轮询机制补充健康检查、连接复用和故障恢复能力,避免请求被持续打到已失联或过载的节点上。
轮询下的健康检查配置
轮询不会主动探测后端是否真能响应业务请求,默认只做 TCP 连通性判断。要真正保障性能,需显式配置失败判定逻辑:
max_fails:在指定时间内连续失败多少次,就标记该节点为不可用 fail_timeout:失效状态持续多久(秒),超时后重新尝试接入upstream backend { server 192.168.1.101:8080 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 max_fails=3 fail_timeout=30s; server 192.168.1.103:8080 max_fails=3 fail_timeout=30s;}
这样当某台服务器 HTTP 返回 5xx 或超时超过 3 次/30 秒,Nginx 就自动将其剔除,后续请求不再分发过去,直到 timeout 结束再试探恢复。
长连接与连接池优化
频繁建连会消耗大量 TIME_WAIT 和 CPU 资源,尤其在高并发场景下显著拖慢轮询效率。启用 upstream 级别 keepalive 可复用连接:
keepalive N:定义每个 worker 进程维护的空闲连接池大小(建议 16–64) upstream backend { keepalive 32; server 192.168.1.101:8080; server 192.168.1.102:8080;}server { location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ''; }}
这能大幅降低后端建立新连接的压力,提升整体吞吐。
轮询公平性的隐性保障
轮询看似均匀,但若后端响应时间差异大(比如一台 20ms,另一台 500ms),短连接场景下慢节点会积压更多请求。可通过以下方式缓解:
备份节点与优雅降级
轮询本身无容灾能力。添加 backup 标识可提供兜底:
upstream backend { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080 backup; #仅当其他全不可用时启用}
配合健康检查,就能在多数节点异常时仍保持服务可用,而不是直接报 502。
不复杂但容易忽略