haproxy和tomcat间歇挂起

我试图在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

  • 添加“统计启用”您的“听”部分
  • 浏览到http:// your-proxy:81 / haproxy?stats

那么,你应该在haproxy和netcat之间运行tcpdump来弄清楚发生了什么。 Haproxy说,它没有得到响应,可能会被讨论,但很明显,它已经连接并发送请求,否则它不能等待头。 tomcat没有看到任何传入请求的事实令人不安,因为至less我可以接受haproxy上的一个错误,导致它在响应超时,但在这里我们说,tomcat没有理由回应,因为它不考虑它得到了一个请求。 或者在tomcat上有一个bug,或者在你的networking上有一些奇怪的东西(两个在同一个IP上的服务器?),因为至less它应该告诉你它已经收到连接和请求了! Tcpdump将很容易地sorting。 另外,你运行的是什么版本的haproxy? 1.3.16和1.3.19之间的版本有几个问题,其中在最后一个响应数据包上发生了一个随机超时(但是在这里,tomcat表示它没有响应,但无论如何,最好是固定的东西)。

威利