Nginx配置keepalive后客户端请求依然无复用,该怎么排查?
我在Nginx服务器配置了keepalive参数,但通过浏览器开发者工具看网络请求时,每个资源还是显示HTTP/1.1"且连接没有复用。配置文件里写了:
http {
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
root html;
index index.html;
keepalive_timeout 30;
}
}
}
重启Nginx后访问静态页面,发现每次请求的Connection头显示close。尝试过在location块里加proxy_http_version 1.1;也没用,是不是配置位置有问题?或者客户端必须支持特定协议?
更关键的是,HTTP keep-alive 复用依赖客户端和服务端都支持 Connection: keep-alive,并且协议版本匹配。浏览器默认用 HTTP/1.1,Connection 已经默认是 keep-alive,但你看每个请求都是 close,说明连接被主动断了。
先检查这几个点:
第一,确保 upstream 或 server 没有强制关闭连接。如果你用了反向代理,才需要 proxy_http_version 1.1; 和 proxy_set_header Connection ""; 但现在你是直接 serve 静态文件,不需要这些。你现在的问题是静态资源服务场景,要确认 listen 没有加 http2 或其他干扰选项。
第二,你的配置里 listen 80 是 HTTP/1.1 明文,浏览器请求过来如果用了 HTTPS 或 H2,根本不会走这个 server 块。检查下你实际访问的是不是 http://localhost 这种纯 80 端口地址,别用 https 浏览器自动升级到 h2 了,HTTP/2 用的是多路复用,Connection 头压根不显示 keep-alive,开发者工具里也不会看到传统意义上的连接复用。
第三,浏览器开发者工具里看 Timing 标签页,如果有 “Reused connection” 就算复用了。不要只看 Connection 响应头是不是 close —— Nginx 默认不会回传 Connection: keep-alive,只要没回 close,且 TCP 连接复用了就算成功。
最简单的验证方式:用 curl 复现请求
观察第二个请求有没有走新 TCP 连接。如果走了新连接,那就是服务端没生效;如果复用,就是浏览器那边展示问题。
建议把配置改成:
删掉 location 里的 keepalive_timeout,那个不生效。然后用 curl + 抓包验证,效率更高。浏览器那套太容易误导人。