我有一个 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 保持连接打开。
我很可能会误解这是如何工作的,而我看到的行为实际上是可取的,在这种情况下,我会很感激一些启发。