如何合理配置 Nginx 客户端连接的超时时间(如 keepalive_timeout、client_header_timeout 等)?
合理配置 Nginx 的客户端连接超时时间,是优化服务器性能、提高并发能力以及防御慢速攻击(如 Slowloris DDoS)的关键步骤。
配置的核心思路是“在保证正常用户体验的前提下,尽可能快地释放空闲和恶意的连接,以节省服务器资源(CPU、内存和端口)”。
以下是 Nginx 中几个核心客户端超时指令的详细解析及合理配置建议:
一、 核心超时指令解析与推荐值
1. keepalive_timeout(保持连接超时时间)
- 作用:决定了一个 TCP 长连接在没有活动后,Nginx 会保持打开多长时间。复用连接可以减少 TCP 三次握手和四次挥手的开销,但设置过长会导致大量空闲连接占用 Worker 资源。
- 默认值:
75s - 合理配置:
- 普通 Web 站点/静态博客:
60s(与默认值相近即可)。 - 高并发 API 服务:
15s - 30s。API 请求通常非常快,短时间内完成交互后应尽快释放连接。 - 注意:该指令可以带第二个参数,如
keepalive_timeout 30s 30s;,第二个参数会在响应头中添加Keep-Alive: timeout=30,告诉浏览器在此时间后主动断开连接。
- 普通 Web 站点/静态博客:
- 配套指令:
keepalive_requests(默认 1000)。表示在一个长连接上最多能处理多少个请求。对于 QPS 极高的场景,建议调大(例如keepalive_requests 10000;),避免频繁断开。
2. client_header_timeout(读取请求头超时时间)
- 作用:Nginx 等待客户端发送完整 HTTP 请求头的时间。
- 默认值:
60s - 合理配置:
10s - 15s。正常网络下,发送几 KB 的请求头只需毫秒级。60s 实在太长,这是防范 Slowloris 攻击(慢速请求头攻击)最关键的配置。如果客户端在此时间内未发送完请求头,Nginx 将返回408 (Request Time-out)。
3. client_body_timeout(读取请求体超时时间)
- 作用:Nginx 读取客户端 HTTP 请求体(如 POST 数据)的超时时间。注意:这并不是指接收整个请求体的总时间,而是指两次相邻的读取操作之间的最大时间间隔。
- 默认值:
60s - 合理配置:
10s - 20s。同样为了防止慢速攻击。对于普通的表单提交或 JSON 数据,10s 绰绰有余。
4. send_timeout(向客户端发送响应超时时间)
- 作用:Nginx 向客户端发送响应数据的超时时间。同样,它不是指发送整个响应的总时间,而是指两次相邻的写操作之间的最大时间间隔。
- 默认值:
60s - 合理配置:
10s - 30s。如果客户端由于网络极差或恶意不接收数据,Nginx 应该及时切断连接,释放资源。
二、 针对不同场景的综合配置模板
建议将这些基础配置放在 nginx.conf 的 http {} 块中作为全局默认值,特殊接口再通过 location {} 块进行覆盖。
场景 1:常规 Web 站点 / 均衡型(推荐起点)
适合绝大多数普通的网站、SaaS 后台。
plaintext
http {
# 基础超时设置
keepalive_timeout 60 60;
keepalive_requests 1000;
# 防御慢速攻击,降低资源占用
client_header_timeout 15;
client_body_timeout 15;
send_timeout 15;
}
场景 2:高并发、前后端分离的 API 接口
特点是请求包体积小、响应快、并发量极大。核心是“快进快出”。
plaintext
http {
keepalive_timeout 15 15; # 快速释放空闲连接
keepalive_requests 5000; # 允许复用连接处理更多请求
client_header_timeout 10; # API 请求头瞬间发送完毕
client_body_timeout 10; # 接收 JSON 极快
send_timeout 10; # 响应数据通常很小
}
场景 3:包含大文件上传/下载的站点
强烈建议不要全局放大超时时间,而是针对特定的上传/下载路径进行局部放大。
plaintext
http {
# 全局依然保持较短的超时时间
keepalive_timeout 30;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 15;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
# 针对大文件上传/下载的特定路由,放宽超时时间
location /api/upload {
client_max_body_size 500M; # 允许的大文件尺寸
client_body_timeout 300; # 允许客户端花 5 分钟慢慢上传(2次包间隔)
send_timeout 300;
proxy_pass http://backend;
}
}
}
三、 补充建议与注意事项
- 配合操作系统网络参数 (sysctl):
Nginx 属于应用层,底层的 TCP 连接也受 Linux 内核参数控制。配合调整系统参数效果更好,例如减少 TCP 芬兰等待时间:bashsysctl -w net.ipv4.tcp_fin_timeout=15 sysctl -w net.ipv4.tcp_keepalive_time=600 - 上游(后端)超时时间:
本文讨论的是 Nginx 与客户端(浏览器)的超时。如果 Nginx 作为反向代理(Proxy),还需要关注 Nginx 与后端服务的超时配置(proxy_connect_timeout,proxy_read_timeout,proxy_send_timeout)。反向代理的超时通常要比客户端超时稍微短一点或一致,避免 Nginx 傻等。 - 平滑重载:
修改配置后,务必先测试语法,再平滑重载,以免影响线上业务:bashnginx -t nginx -s reload