1

我有一个 Tomcat 6.0 服务器的 Nginx,使用 APR 连接器。

我已将 Nginx 配置为通过 HTTP/1.1 与 Tomcat 通信:

http {
    ...
    upstream tomcat {
        server 127.0.0.1:8080;
        keepalive 16;
    }

    server {
        ....
        location ... {
            proxy_pass http://tomcat;
            proxy_http_version 1.1;
            proxy_set_header Connection "Keep-Alive";
            ...
        }
    }
}

Tomcat 设置为 connectionTimeout 为 60 秒,keepAliveTimeout 为 60 秒,maxKeepAliveRequests 设置为“-1”(无限制)。

我一直在跟踪 Nginx 和 Tomcat 之间处于 TIME_WAIT 状态的套接字,并注意到一旦在中重负载下建立了 500-600 个连接,就会有相等数量的 TIME_WAIT 套接字。

我使用 tcpdump 收集了一个转储并使用 Wireshark 对其进行分析,并注意到始终是 Nginx 通过向 127.0.0.1:8080 发送 FIN 来启动 TCP 连接终止。具体来说,如果在 Tomcat 中运行的 Web 服务需要大约 8-10 秒的响应时间,就会发生这种情况。Nginx 从 Tomcat 获得 HTTP/1.1 200 OK 响应,然后等待几秒钟并将 FIN/ACK 发送到 Tomcat。

有没有办法保持连接打开?将 keepalive 设置增加到一个较大的数字(例如 256)会消除 TIME_WAIT 套接字,但我宁愿将此值保持在较低水平并让 Nginx 保持连接打开。

我很可能会误解这是如何工作的,而我看到的行为实际上是可取的,在这种情况下,我会很感激一些启发。

4

0 回答 0