nginx高并发防护需超时配置、熔断感知与优雅退出三者协同:设client_header_timeout等五类超时防慢速攻击,配proxy_read_timeout等上游超时+max_fails实现熔断,用worker_shutdown_timeout强制平滑退出,并辅以limit_conn/req限流及日志告警。

要让 Nginx 在高并发下守住吞吐底线,关键不是堆资源,而是主动切断“假连接、真耗子”的慢速路径——它不靠大流量压垮你,而是用极低带宽长期卡住 worker 的事件循环。真正的防护,是超时配置 + 熔断感知 + 优雅退出三者咬合:超时负责快速识别异常连接,熔断防止故障扩散,优雅退出确保 reload 不中断业务。
收紧客户端连接生命周期,掐断慢速攻击入口
慢速攻击(Slowloris、Slow POST、Slow Read)本质是利用 Nginx 默认宽松的超时,让单个连接长期停留在 reading / sending 状态,挤占 worker_connections 和内存缓冲区。必须逐层设防:
- client_header_timeout 5s:客户端必须在 5 秒内发完全部请求头,否则返回 408;对 HTTP/2 也生效(头部帧需完整送达)
- client_body_timeout 8s:POST/PUT 请求体传输不能拖太久;若 Content-Length 明确但发送速率低于 1KB/s 持续超时,直接断连
- send_timeout 10s:两次响应数据发送间隔超 10 秒,即关闭连接;防客户端窗口卡死或极慢读取
- keepalive_timeout 15s 30s:空闲长连接最多保持 15 秒,且向客户端声明 Keep-Alive: timeout=30;避免浏览器维持无效连接
- 启用 reset_timedout_connection on:超时后发 RST 而非 FIN,加速释放 TIME_WAIT,减少端口占用
配置上游代理超时与健康探测,实现自动熔断避障
当后端服务响应变慢或部分节点失联,Nginx 若继续转发,会把 worker 卡在 proxy_read_timeout 等待中,形成“连接池雪崩”。需让 upstream 主动退避:
- proxy_connect_timeout 3s:建连失败快判,3 秒内连不上就换节点
- proxy_send_timeout 10s:发请求给后端超时即放弃,不等后端接收完成
- proxy_read_timeout 12s:后端响应头+首块体必须在 12 秒内到达;超过则关连接、记失败
- upstream 中配置 max_fails=2 fail_timeout=15s:同一节点连续 2 次超时或 5xx,在 15 秒内不再调度;配合 backup 或 slow_start=30s 实现故障隔离
- 开启 proxy_next_upstream error timeout http_502 http_504:允许在这些异常时重试另一台,但需注意幂等性
强制 worker 平滑退出时限,避免 reload 卡死事件循环
执行 nginx -s reload 时,旧 worker 进入优雅关闭流程。若存在未关闭的 WebSocket、HTTP/2 流或慢后端响应,它们可能无限期挂起,导致旧进程滞留、新 worker 无法充分接管。必须用 worker_shutdown_timeout 设硬上限:
- 该指令只能写在 main 块(全局上下文),例如:
worker_shutdown_timeout 25s; - 值建议设为 略大于 proxy_read_timeout + 后端平均处理时间,如后端 P99 响应在 8s 内,则设 25s 较稳妥
- 配合 limit_conn 使用:比如限制单 IP 最多 3 个连接,可确保即使有慢连接,也不会挤占全部 worker_connections
- 验证方式:reload 后观察
ps aux | grep nginx,旧 worker 应在 25s 内全部消失;error.log 出现exited on signal 15 after 25.000 sec即生效
补充防御层:限连 + 限流 + 日志联动
超时和熔断是基础,还需叠加资源配额与行为分析,形成闭环:
- limit_conn_zone $binary_remote_addr zone=perip:10m; + limit_conn perip 3;:按二进制 IP 哈希限连,防单 IP 建大量空闲连接
- limit_req_zone $uri zone=api_limit:10m rate=10r/s; + limit_req zone=api_limit burst=20 nodelay;:对高频接口强控节奏,burst 内不排队,超了直接 503
- 开启 error_log /var/log/nginx/error.log warn;,重点关注
client timed out、upstream timed out、no live upstreams等关键词,可接入 ELK 或 Prometheus 做慢连接趋势告警 - 禁用不必要的模块(如 autoindex、ssi),减少事件循环中潜在的阻塞点











