keepalive_timeout只能在http块或events块中配置,不能在server块中使用;它作用于监听套接字层面,控制HTTP长连接空闲超时时间,同一端口所有server块共享该设置。
不能在 server 块中直接配置保持连接超时时间来释放死连接。
Nginx 的 keepalive_timeout 是作用于监听套接字(listen)层面的指令,它控制的是 TCP 连接建立后、HTTP 请求空闲状态下的最大等待时间。这个行为发生在 Nginx 接受连接(accept)之后、但尚未解析请求头和匹配 server 块之前。因此:
server 块里写 keepalive_timeout 5s;,Nginx 会忽略该配置,并报错或警告“directive is not allowed here”server 块共享该端口的 keepalive 行为该指令只能在 http 块或 events 块(部分旧版本)中设置,全局生效;或者通过不同端口 + 独立 listen 实现差异化控制:
http 块中写 keepalive_timeout 30s;,影响所有使用该端口的虚拟主机http 块中配合 listen 指令间接区分例如:server { listen 8080; ... } 和 server { listen 8081; ... },再通过全局配置或 so_keepalive 参数分别管理
单靠 keepalive_timeout 只能清理空闲连接,对卡住不发 FIN、也不发数据的半开连接效果有限。更有效的做法是协同使用以下参数:
keepalive_requests 100;:限制单个连接最多处理请求数,防止单连接长期驻留、累积内存reset_timedout_connection on;:对超时未完成读写的连接,直接重置(RST)而非等待 FIN,更快释放资源client_header_timeout 10s; 和 client_body_timeout 12s;:快速终结卡在请求头/体传输阶段的连接so_keepalive=on;(Linux):启用内核级 TCP keepalive 探测,可识别底层断连可以通过终端命令观察连接生命周期变化:
curl -I http://your-site/ 查看响应头是否含 Keep-Alive: timeout=30
ss -tan | grep :80 | grep ESTAB 观察连接存活时长是否接近你设的 keepalive_timeout
nc 建连后不发请求),确认连接是否在超时后消失