调整 Nginx keepalive_timeout 参数需要在配置文件的 http、server 或 location 块中设置秒数,适用于减少频繁建立 TCP 连接带来的开销,但设置过高可能导致 worker 进程连接数耗尽。
先说结论:适当增加 keepalive_timeout 值可以提升长连接复用率,但需结合 worker_connections 上限评估资源占用。
- 先定位:确认业务场景是短请求高频并发还是长轮询等待。
- 先做:在
nginx.conf中修改keepalive_timeout数值并执行语法检查。 - 再验证:通过客户端请求头和服务端活跃连接数确认配置生效。
命令速用版
以下配置片段可直接放入 nginx.conf 的 http 块中,修改后需重载服务。
http {
# 设置客户端长连接超时时间为 65 秒
keepalive_timeout 65;
# 设置单个长连接最大请求数,默认 100
keepalive_requests 100;
}
执行以下命令检查配置并重载:
nginx -t
nginx -s reload为什么会这样
keepalive_timeout 决定了服务器端保留空闲客户端连接的时间长度,超时后连接关闭。
HTTP 长连接复用避免了每次请求都进行 TCP 三次握手和 TLS 握手,降低延迟和 CPU 消耗。但如果服务器端保留连接时间过长,大量空闲连接会占用文件描述符和内存,导致新连接无法建立。调整该参数是在连接复用收益与服务器资源消耗之间寻找平衡。
分步处理
按以下步骤调整参数,确保配置生效且不影响现有业务。
步骤 1:备份配置文件
在修改前备份当前配置,以便出现问题时快速回滚。
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak步骤 2:修改超时参数
使用编辑器打开配置文件,找到 http 块,添加或修改 keepalive_timeout。根据业务需求,通常设置在 60 至 120 秒之间,公开资料中没有看到可靠的量化数据表明特定数值能提升具体百分比性能,需根据实际监控调整。
keepalive_timeout 75;步骤 3:检查语法
修改后必须执行语法检查,防止配置错误导致服务启动失败。
nginx -t如果输出 syntax is ok 和 test is successful,则继续下一步。
步骤 4:重载服务
执行平滑重载,使新配置生效而不中断现有连接。
nginx -s reload怎么验证是否生效
通过客户端请求响应头和服务端连接状态确认长连接策略是否工作。
方法 1:检查响应头
使用 curl 发送请求,查看响应头中是否包含 Connection: keep-alive 及 Keep-Alive: timeout=...。
curl -I -v http://your-domain.com如果响应头中出现 Keep-Alive: timeout=75(假设设置为 75),说明参数已下发给客户端。
方法 2:监控活跃连接
使用 netstat 或 ss 命令查看服务器上的 ESTABLISHED 连接数。在停止发送请求后,观察连接是否在设定的超时时间后关闭。
ss -ant | grep ESTABLISHED | wc -l方法 3:查看错误日志
检查 /var/log/nginx/error.log,确认没有大量因连接数不足导致的错误。
常见坑
调整长连接参数时,以下场景容易导致配置无效或性能下降。
- 混淆客户端与上游连接:
keepalive_timeout控制的是客户端到 Nginx 的连接,Nginx 到后端服务(如 PHP-FPM、Tomcat)的长连接需在upstream块中配置keepalive参数,两者互不影响。 - 忽视 worker_connections 限制:增加超时时间会增加单 worker 进程持有的连接数,如果并发高且超时过长,可能触达
worker_connections上限,导致新请求被拒绝。 - 浏览器端限制:部分浏览器对同一域名的长连接数有限制(如 6 个),服务器端设置再大也无法突破客户端限制。
- 负载均衡器干扰:如果 Nginx 前端还有负载均衡器(如 AWS ELB),负载均衡器的空闲超时设置若小于 Nginx 设置,连接会被负载均衡器先切断。
常见问题
keepalive_timeout 默认值是多少?
Nginx 官方文档指出默认值为 65 秒。
keepalive_timeout 和 upstream keepalive 有什么区别?
keepalive_timeout 控制客户端到 Nginx 的连接超时,upstream keepalive 控制 Nginx 到后端服务器的空闲连接池大小。
设置越大复用率越高吗?
不一定,超过客户端闲置习惯的时间后,继续增大数值只会占用服务器资源而不会增加复用。
参考来源
- 来源名:Nginx Official Documentation
- 页面标题:Module ngx_http_core_module
- URL:http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout