防CC攻击关键是快速释放低速长时连接,Nginx通过分层超时控制:客户端入口设client_header_timeout、client_body_timeout等;响应阶段用send_timeout+reset_timedout_connection;上游用proxy_*_timeout熔断;TCP层由stream模块proxy_timeout兜底。

防 CC 攻击的关键不是拦住所有请求,而是让“低速、长时、低价值”的连接快速释放资源。Nginx 本身不识别业务逻辑,但可以通过精准的超时分层控制,把恶意慢连、假连接、空闲挂起连接在不同阶段主动断开,避免它们挤占 worker 连接数和事件循环。
收紧客户端连接入口:防 Slowloris 类攻击
CC 攻击常伪装成合法 HTTP 请求,但故意拖慢请求头或请求体发送节奏。必须在 Nginx 接收阶段就设硬性时限:
- client_header_timeout 5s:客户端必须在 5 秒内发完全部请求头(包括 Host、User-Agent 等),超时即返回 408,专治 Slowloris
- client_body_timeout 8s:POST/PUT 请求体传输中,两次数据到达间隔超过 8 秒即断连;若 Content-Length 明确但速率持续低于 1KB/s,也触发断开
- keepalive_timeout 15s:HTTP/1.1 长连接空闲时间上限设为 15 秒(非总存活时间),每次新请求都会重置计时器
- keepalive_requests 100:单个长连接最多处理 100 次请求,防止单连接长期占用、累积响应缓冲
阻断慢速响应与接收:防 Slow Read 和卡死连接
有些 CC 流量会正常发请求,但故意缓慢读取响应(如 curl --limit-rate 10),让 Nginx 一直等待 write 就绪。这类连接需用 send_timeout + 强制复位来清理:
- send_timeout 12s:向客户端写响应时,两次 write 间隔超 12 秒即关闭连接(静态资源建议 10–20s,流式接口慎用)
- reset_timedout_connection on:必须开启!否则仅发 FIN,客户端不响应会导致连接卡在 TIME_WAIT;开启后直接发 RST,worker 可立即复用该 socket
- 该组合对真实弱网用户影响小,但能快速终结恶意慢读——因为正常浏览器下载 JS/CSS 几乎都在毫秒级完成
隔离上游异常:防后端拖垮 Nginx 事件循环
CC 攻击也可能通过打穿下游服务(如 Redis、API 网关)间接压垮 Nginx。此时需 upstream 层熔断,避免 proxy_read_timeout 把 worker 卡死:
- proxy_connect_timeout 3s:建连失败快判,3 秒未通就换节点或返回错误
- proxy_send_timeout 8s:向后端发完请求后,8 秒内没收到 ACK 或响应头即放弃
- proxy_read_timeout 10s:后端响应头 + 首块数据必须在 10 秒内到达,超时即关连接、记失败
- upstream 中配置 max_fails=2 fail_timeout=15s:同一节点连续失败 2 次,15 秒内不再调度;配合 backup 或 slow_start=30s 实现自动避障
TCP 层兜底:stream 模块防非 HTTP 协议慢连
若 Nginx 同时代理 TCP 流量(如 WebSocket 前置、自定义协议),HTTP 层超时无效,需启用 stream 模块的专用机制:
- proxy_timeout 30s:仅在 stream 块中生效,三次握手完成后,上下游完全无数据交互达 30 秒即主动断连
- 搭配 proxy_connect_timeout 5s 控制建连耗时,再加 health_check interval=5s fails=2 passes=2 主动探测后端活性
- 注意:此参数不干预 SSL 握手或业务协议解析,只管 TCP 空闲状态


















