nginx防恶意连接需四阶段设限:连接建立(client_header_timeout等超时控制)、传输(client_body_timeout/send_timeout)、空闲(keepalive_timeout+reset_timedout_connection)、复用(keepalive_requests+limit_conn+limit_req),并隔离后端异常、按资源类型差异化关闭长连接。

防止恶意连接耗尽 Nginx 代理线程,核心不是等连接“堆满再处理”,而是从连接建立、传输、空闲、复用四个阶段主动设限,把慢速、假长、高频复用的异常路径在源头掐断。
收紧客户端生命周期,防慢速攻击卡住事件循环
恶意连接常以极低带宽长期维持 reading/sending 状态(如 Slowloris、Slow POST),占用 worker 连接槽位却不释放。必须逐层缩短其存活窗口:
- client_header_timeout 5s:请求头必须 5 秒内发完,超时即返 408,专治头部未完成类攻击
- client_body_timeout 8s:POST/PUT 体传输中,两次数据到达间隔超 8 秒就断连;对明确 Content-Length 且速率低于 1KB/s 的连接也强制终止
- send_timeout 10s:向客户端写响应时,两次 write 间隔超 10 秒即关闭,防客户端窗口卡死或极慢读取
- keepalive_timeout 15s 30s:空闲长连接最多保持 15 秒;同时响应头声明 Keep-Alive: timeout=30,避免浏览器误判为永久连接
- reset_timedout_connection on:超时后发 RST 而非 FIN,加速释放 TIME_WAIT,减少端口堆积
限制单连接资源强度,防复用式高频刷量
攻击者常建一个长连接反复发请求(如自动化脚本刷 API),靠 keepalive_requests 默认值 100 就能撑几百次调用。需组合限流:
- keepalive_requests 30:单个连接最多处理 30 次请求,达到即断开,打断脚本循环模式
- limit_conn addr 5:每 IP 最多 5 个并发连接,防 IP 级连接池占满
- limit_req zone=api_rate burst=10 nodelay:配合 limit_req_zone $binary_remote_addr zone=api_rate:10m rate=5r/s,控每秒请求数,burst 容忍短时 AJAX 脉冲,nodelay 避免排队阻塞
隔离后端异常,防代理线程被上游拖死
当后端响应变慢或部分节点失联,Nginx 若持续转发,worker 会卡在 proxy_read_timeout 等等待中,形成“连接池雪崩”:
- proxy_connect_timeout 3s:建连失败快速判负,3 秒内连不上就换节点
- proxy_send_timeout 10s:发请求给后端超时即放弃,不等接收完成
- proxy_read_timeout 12s:后端响应头 + 首块体必须 12 秒内到达,否则关连接并记失败
- upstream 中配 max_fails=2 fail_timeout=15s:同一节点连续 2 次超时或 5xx,15 秒内不再调度
- proxy_next_upstream error timeout http_502 http_504:允许重试另一台,但仅限幂等操作
区分资源类型,关闭非必要长连接
静态资源和公开接口无需长连接,强行保持反而增加攻击面:
- location ~ \.(js|css|png|jpg|gif)$ { keepalive_disable all; }:JS/CSS/图片响应完立即断开,比 keepalive_timeout 0 更彻底
- location /status { keepalive_disable all; }:健康检查接口禁用 keepalive,防探测连接长期驻留
- 对 WebSocket 升级路径,单独设 proxy_read_timeout 86400,避免误杀合法长连接











