12人参与 • 2026-08-02 • Mysql
当 nginx 作为反向代理时,它位于客户端和后端应用服务器(如 tomcat, node.js, php-fpm)之间。一个常见的性能陷阱是:nginx 与后端服务器之间的连接默认是短连接!
这意味着,对于每一个来自客户端的请求,nginx 都会:
而后端服务器处理 tcp 连接的开销通常远大于 nginx。在高并发场景下,这种“用完即弃”的模式会导致:
time_wait 连接。upstream keepalive 机制正是为解决此问题而生。它允许 nginx 与后端服务器之间复用 tcp 连接,将 nginx 从“短连接制造机”转变为高效的“连接管理者”。
💡 核心价值:
正确配置 upstream keepalive,是释放 nginx 反向代理全部性能潜力的关键一步,能带来数倍的 qps 提升!
upstream keepalive 并非简单地开启一个开关,而是建立了一个智能的连接池。
upstream 连接池,看是否有空闲的、指向目标后端的 keepalive 连接。worker 进程隔离的。总的最大空闲连接数 = keepalive * worker_processes。keepalive 指令定义的是空闲连接的数量上限,而不是总连接数。活跃的连接不受此限制。要让 upstream keepalive 生效,必须同时配置以下三个部分,缺一不可。
upstream backend {
# 为每个 worker 进程缓存 32 个空闲的 keepalive 连接
keepalive 32;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}server {
location / {
proxy_pass http://backend;
# 必须设置!强制 nginx 使用 http/1.1 与后端通信
proxy_http_version 1.1;
}
}server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
# 必须设置!清除从客户端带来的 connection 头
proxy_set_header connection "";
}
}keepalive 的值并非越大越好,需要根据业务场景精确计算。
一个经验公式是:
每个后端所需连接数 ≈ (qps / 后端数量) * 平均响应时间(秒)
假设你的系统指标如下:
计算过程:
2000 / 4 = 500500 * 0.05 = 25因此,keepalive 的值应略大于 25,比如设置为 32。
time_wait: 使用 ss -tan state time-wait | wc -l 命令。配置生效后,time_wait 连接数应大幅下降。wrk 或 ab 工具进行压测,对比开启前后的 qps 和延迟。这是最常见的错误。结果是,nginx 依然使用 http/1.0 与后端通信,keepalive 指令完全失效。
确保你的后端应用(如 tomcat)也配置了合理的 keepalivetimeout 和 maxkeepaliverequests。如果后端主动关闭连接,nginx 的连接池就失去了意义。
如果 keepalive 值设置过小,在高并发下,连接池会频繁地创建和销毁连接,无法达到复用的效果,性能提升有限。
当 proxy_next_upstream 触发重试时,nginx 会关闭当前连接并尝试下一个服务器。这属于正常行为,但需注意它会影响连接池的利用率。
到此这篇关于nginx对上游服务器使用keepalive的使用的文章就介绍到这了,更多相关nginx 上游服务器使用keepalive内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论