我试图在Solaris x86机器上的tomcat前运行haproxy,但是我得到间歇性故障。 看似随机的时间间隔,请求只是挂起,直到haproxy超时连接。
我想也许这是我的应用程序,但我已经能够重现与tomcatpipe理器应用程序,直接打到tomcat没有任何问题。
用curl反复打击会在10-15次尝试中导致错误
curl -ikL http://admin:admin@<my server>:81/manager/status
haproxy在端口81上运行,在端口7000上运行tomcat。haproxy向客户端返回504网关超时,并将其放入日志文件中:
Sep 7 21:39:53 localhost haproxy[16887]: xxx.xxx.xxx.xxx:65168 [07/Sep/2009:21:39:23.005] http_proxy http_proxy/tomcat7000 5/0/0/-1/30014 504 194 - - sHNN 0/0/0/0/0 0/0 "GET /manager/status HTTP/1.1"
Tomcat什么也没有显示,在日志中没有错误,也没有显示这个请求是否已经到达tomcat服务器。 请求计数不会递增,pipe理器应用程序只在一个线程上显示活动,提供pipe理器应用程序。
这里是我的haproxy和tomcat连接器设置,我一直在玩很多尝试追查问题,所以他们可能不是理想的,但他们肯定不会导致这个错误。
server.xml中
<Connector port="7000" protocol="HTTP/1.1" enableLookups="false" maxKeepAliveRequests="1" connectionLinger="10" />
haproxyconfiguration
global log loghost local0 chroot /var/haproxy listen http_proxy :81 mode http log global option httplog option httpclose clitimeout 150000 srvtimeout 30000 contimeout 3000 balance roundrobin cookie SERVERID insert server tomcat7000 127.0.0.1:7000 cookie server00 check inter 2000
我怀疑你的Tomcat暂停了一个完整的垃圾收集,这就是为什么它没有响应或logging任何东西。 在这里看到更多关于这个问题的信息。
如果打开haproxy统计信息服务器,额外的信息可能会帮助您debugging
那么,你应该在haproxy和netcat之间运行tcpdump来弄清楚发生了什么。 Haproxy说,它没有得到响应,可能会被讨论,但很明显,它已经连接并发送请求,否则它不能等待头。 tomcat没有看到任何传入请求的事实令人不安,因为至less我可以接受haproxy上的一个错误,导致它在响应超时,但在这里我们说,tomcat没有理由回应,因为它不考虑它得到了一个请求。 或者在tomcat上有一个bug,或者在你的networking上有一些奇怪的东西(两个在同一个IP上的服务器?),因为至less它应该告诉你它已经收到连接和请求了! Tcpdump将很容易地sorting。 另外,你运行的是什么版本的haproxy? 1.3.16和1.3.19之间的版本有几个问题,其中在最后一个响应数据包上发生了一个随机超时(但是在这里,tomcat表示它没有响应,但无论如何,最好是固定的东西)。
威利