Nginx应对突发流量需“按需调度+弹性缓冲+快速止损”:least_conn抗短连接洪峰,ip_hash保长连接会话,weight适配异构后端,响应时间加权优化延迟敏感接口;通过多upstream+map实现秒级算法切换,并配合连接限流、请求分流、响应容错三层防护及动态降级。

用 Nginx 做负载均衡应对后端集群突发流量,核心不是“平均分发”,而是“按需调度+弹性缓冲+快速止损”。单靠轮询或加权分配远远不够,必须结合算法切换、连接控制、限流熔断和健康感知,形成多层响应机制。
选对算法:根据流量特征动态匹配
不同突发场景需要不同调度逻辑:
-
短连接洪峰(如秒杀、抢券):启用
least_conn。它把新请求发给当前活跃连接最少的后端,避免某台机器瞬间被打满,比轮询更抗冲击。 -
长连接会话(如 WebSocket、在线课堂):用
ip_hash+ 主动健康检查。保证用户始终落在同一台后端,同时自动隔离异常节点,防止会话中断。 -
后端能力不均(新老机器混布):配置
weight,例如新服务器设weight=5,旧服务器设weight=2,让流量按真实处理能力分摊。 -
延迟敏感接口(如搜索、推荐):配合
nginx-upstream-check-module,基于响应时间动态调权,慢节点自动降权,快节点承接更多。
稳住入口:调大 backlog 防连接丢弃
突发流量最先冲击的是 TCP 连接建立环节。若系统来不及 accept 新连接,内核会直接丢弃 SYN 包,客户端看到的是 Connection refused,日志里都留不下痕迹。
- 同步调大三个关键参数:
net.core.somaxconn(accept 队列上限)、net.ipv4.tcp_max_syn_backlog(SYN 队列长度)、ulimit -n(文件描述符限制),建议统一设为65535或更高。 - Nginx 的
listen指令必须显式声明:listen 80 backlog=65535;,否则默认值(通常为 511)在高并发下极易成为瓶颈。 - 验证是否生效:压测时运行
ss -lnt,观察对应端口的Recv-Q值是否接近你设置的backlog值。
保护后端:三层过载防护不能只靠限流
限流只是第一道闸,真实过载常始于连接堆积、请求积压和响应阻塞:
-
连接层防护:用
limit_conn_zone $binary_remote_addr zone=conn_perip:10m;+limit_conn conn_perip 10;,防 Slowloris 类慢速攻击,限制单 IP 并发连接数。 -
请求层分流:对非核心路径(如评论、分享、埋点)单独限流;对运维接口(
/health、/metrics)严格限速(如rate=1r/s),避免探针自身引发压测。 -
响应层容错:配置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504+proxy_next_upstream_tries 2,后端短暂不可用时自动重试并摘除,切断雪崩链路。
快速响应:热切换与动态降级能力
Nginx 不支持运行时修改 upstream 算法,但可通过配置重组实现秒级切换:
- 定义多个 upstream 块,分别配置
least_conn、ip_hash、weighted round robin等策略。 - 用
map指令提取请求特征(如$http_x_mode头或 cookie),动态选择目标 upstream:map $http_x_mode $target { "least" "upstream_least"; "hash" "upstream_hash"; default "upstream_default"; },再在proxy_pass http://$target;中引用。 - 紧急时可临时标记节点为
down,或启用backup服务器兜底;配合error_page 502 503 504 = @fallback返回预置降级页,避免用户看到空白或报错。


















