我们有一个Tomcat前端服务器代理我们的Apache 2.2.11应用服务器,运行在64位Fedora 2.6.21.7 EC2 2xlarge实例(AKI aki-b51cf9dc)上。 Apache正在运行mod_perl并且没有线程化。
我们正在尝试在Tomcat之间长时间保持连接,在另一个EC2实例上运行,以及Apache服务器,而不是来自外部客户端的连接直接进入Apache服务器。我们的配置如下所示:
Listen 80
NameVirtualHost *:80
# used for external clients
<VirtualHost *:80>
ServerName xxx.yyy.com
ServerAlias *.yyy.com
DocumentRoot "/var/www/html"
KeepAlive Off
</VirtualHost>
# used from tomcat server on local network
<VirtualHost *:80>
ServerName ip-<Apache-server-local-IP>.ec2.internal
KeepAlive On
KeepAliveTimeout 3600
MaxKeepAliveRequests 0
DocumentRoot "/var/www/html"
</VirtualHost>
TimeOut 60
MinSpareServers 20
MaxSpareServers 30
StartServers 20
MaxClients 60
GracefulShutdownTimeout 90
我们已经为MaxKeepAliveRequests和KeepAliveTimeout尝试了各种各样的值,并且服务器肯定会与Tomcat保持一段时间的连接,但它总是在几秒钟内关闭它,当时只处理了几十个请求。在观察使用mod_status时,我从未见过进程在套接字上保持100个或更多连接可能很重要。
永远不会与非Tomcat客户端建立持久连接,因此我们知道存在一些差异,VirtualHost配置肯定会在两种情况下都应用。
我应该提到Tomcat的请求都是POST,而其他的是POST和GET的混合。
当我使用tcpdump查看给定端口上的流量时,我可以清楚地看到正在正确处理的一些POST,然后在返回一个好的回复(200,数据看起来很好)之后的某个时刻,Apache服务器立即关闭连接,向Tomcat发送FIN。如果最后一个请求或倒数第二个请求之间完全没有区别,或者除了真实客户端的IP等次要数据之外的回复,则会发生这种情况,因此在处理请求时没有指示服务器禁止。当然,错误日志中没有任何可疑之处,httpd进程本身并没有死亡。
从netstat我们可以看到与Tomcat服务器的连接保持打开状态几秒钟,但是在远程端口范围内快速循环,验证我们在其他地方看到的内容。这几乎就像Apache试图公平地分配连接以防止持久的连接挨饿其他人 - 但它不会那样做,不是吗?!
我只想被告知我们在这里做一些蠢事!请告诉我,我是个白痴,或者至少是近视......
答案 0 :(得分:0)
Tomcat上cat /proc/sys/net/ipv4/tcp_keepalive_time
的价值是什么?
异常低吗?默认值为7200(即2小时)
答案 1 :(得分:0)
在ec2.internal
上,MaxKeepAliveRequests 应为-1 ,不是ZERO