nginx 中 location 处理长连接的关键在于正确配置 keepalive 参数,这通常涉及上游代理的长连接复用。在 upstream 块中设置 keepalive 指令可以指定每个 worker 进程保留的空闲连接数,而具体的 location 则通过 proxy_http_version 1.1 和清除 connection 头来启用 http/1.1 的长连接特性。这样做可以避免每次请求都建立新的 tcp 连接,从而显著降低延迟并提高吞吐量。

如何在上游块中定义 keepalive 连接池
要在 Nginx 中启用长连接,首先需要在 upstream 模块中定义后端服务器组,并使用 keepalive 指令设置连接池的大小。这个值决定了每个 Nginx worker 进程能够保持空闲状态并与后端服务器复用的最大连接数。如果连接数达到上限,最久未使用的连接会被关闭以释放资源。

upstream backend {
server 127.0.0.1:8080;
keepalive 32;
}
上述配置创建了一个名为 backend 的上游组,其中包含一个后端服务。关键行 keepalive 32; 告诉 Nginx 为每个 worker 进程维护一个最多包含 32 个空闲连接的池。这些连接在请求完成后不会立即关闭,而是保持在 ESTABLISHED 或 IDLE 状态,等待下一个请求复用。如果没有这个指令,即使使用了 HTTP/1.1,Nginx 也可能因为默认行为或后端限制而频繁断开连接。
Location 中需要配合哪些 HTTP 版本和头部设置
仅仅在 upstream 中设置 keepalive 是不够的,location 块中的配置必须明确指示 Nginx 使用 HTTP/1.1 协议与后端通信,并移除默认的 Connection: close 头部。HTTP/1.0 默认是短连接,而 HTTP/1.1 默认支持长连接,但许多客户端或中间件会发送 Connection: close 强制断开,因此需要显式处理。

server {
listen 80;
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
在 location /api/ 中,proxy_http_version 1.1; 将 Nginx 向后端发起的请求升级为 HTTP/1.1。紧接着,proxy_set_header Connection ""; 清空了 Connection 请求头。如果不执行这一步,Nginx 可能会继承客户端的 Connection: close 头部并将其传递给后端,导致后端关闭连接,从而使 keepalive 池失效。这两个设置共同作用,确保 Nginx 能够成功从池中获取空闲连接进行复用。
当 keepalive 连接数耗尽时会发生什么
当并发请求量超过 keepalive 设定的上限时,Nginx 的行为会发生改变。假设我们设置了 keepalive 32;,如果有 100 个并发请求同时到达,前 32 个请求会尝试复用现有的空闲连接(如果有的话)。如果池中没有任何空闲连接,或者连接数已满,Nginx 将被迫创建新的 TCP 连接到后端服务器。这意味着在高负载下,长连接的优势会被削弱,因为频繁的握手和挥手会增加 CPU 和网络开销。
此外,如果后端服务器主动关闭了连接(例如由于超时),Nginx 会从池中移除该连接。如果此时没有足够的空闲连接可用,新请求同样会触发新建连接。因此,keepalive 的值并非越大越好,它应该根据后端服务器的处理能力、内存限制以及预期的并发连接数来合理设置。过大的值可能导致文件描述符耗尽,而过小的值则无法充分利用长连接的性能优势。通常建议将其设置为 worker_connections 的一部分,并监控实际连接复用率进行调整。











