核心思路是分层设防:在连接建立、请求处理、后端转发三环节分别控制生命周期,避免单请求长期霸占资源;需收紧keepalive_timeout(15s)、keepalive_requests(30)、client_header/body_timeout(12–15s)、send_timeout(10s),并按路径隔离超时、对齐上下游超时、配合限流与可信识别。

核心思路不是单纯延长超时,而是分层设防:在连接建立、请求处理、后端转发三个环节分别控制生命周期,避免单个恶意请求长期霸占资源。
一、收紧客户端连接空闲期
攻击者常靠长连接反复发请求,不靠耗尽时间,而靠耗尽连接数或缓冲区。关键参数要主动收缩:
- keepalive_timeout 15s; —— 把默认75秒压到10–25秒区间,让空闲连接快速释放
- keepalive_requests 30; —— 单连接最多处理30次请求就断开,打断脚本循环刷接口行为
- client_header_timeout 12s; client_body_timeout 15s; —— 防慢速攻击(如Slowloris),头/体读取超时设为10–15秒更稳妥
- send_timeout 10s; —— 响应过程中两次写操作间隔超10秒即断连,防弱网卡住连接
二、对长请求路径做独立超时隔离
不能所有请求共用一套超时值。用 location 精准匹配业务语义,避免泛规则误伤:
- 上传类路径(如
/upload/):proxy_read_timeout 600s;,但配合 client_max_body_size 2g; 和 proxy_request_buffering off; 边收边转 - 报表类API(如
/api/v1/report):proxy_read_timeout 300s;,同时 upstream 中启用 keepalive 32; 复用后端连接 - 静态资源(
\.(js|css|png|jpg)$):keepalive_disable all; —— 彻底禁用长连接,响应完立刻断开
三、后端代理链路全链路超时对齐
前端Nginx超时若比后端服务短,容易触发502;若比后端长,则请求卡在Nginx里白占资源。必须双向约束:
- proxy_connect_timeout 5s; —— 连不上后端,5秒内失败,不等
- proxy_read_timeout 300s; —— 后端处理中,Nginx最多等5分钟,超时返回504
- proxy_send_timeout 300s; —— Nginx往客户端发响应时,分块传输也不能无限拖
- 后端服务自身也要设连接空闲超时(如Tomcat的
connectionTimeout),略大于Nginx的proxy_read_timeout
四、用限流+可信识别组合拦截高频恶意复用
光控超时不够,还得防“一个IP建5个长连接,每个每秒刷10次”这种组合攻击:
- 用 limit_conn addr 5; 控制每IP并发连接数上限
- 搭配 limit_req zone=perip burst=10 nodelay; 控制单位时间内请求数,burst留余量防误杀正常AJAX
- 对内网、CDN或带有效Cookie的用户,用 geo 或 map 指令标记白名单,跳过限流或放宽超时











