Nginx配置keepalive后客户端请求依然无复用,该怎么排查?

♫建英 阅读 27

我在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;也没用,是不是配置位置有问题?或者客户端必须支持特定协议?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
UP主~子硕
你这配置问题出在作用域和协议支持上。keepalive_timeout 放在 http 块是对的,但你在 location 里又写了一次 keepalive_timeout 30,这个语法是无效的,Nginx 不会这么用,location 块里不能单独设置 keepalive 超时。

更关键的是,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 复现请求

curl -H "Connection: keep-alive" -v http://your-server/test.txt > /dev/null && sleep 1 && curl -H "Connection: keep-alive" -v http://your-server/test.txt


观察第二个请求有没有走新 TCP 连接。如果走了新连接,那就是服务端没生效;如果复用,就是浏览器那边展示问题。

建议把配置改成:

http {
keepalive_timeout 65s;
keepalive_requests 100;

server {
listen 80;
location / {
root html;
index index.html;
}
}
}


删掉 location 里的 keepalive_timeout,那个不生效。然后用 curl + 抓包验证,效率更高。浏览器那套太容易误导人。
点赞 4
2026-02-12 13:12