haproxy 和 tomcat 间歇性挂起

haproxy 和 tomcat 间歇性挂起

我正在尝试在 Solaris x86 机器上的 tomcat 前面运行 haproxy,但遇到了间歇性故障。在看似随机的时间间隔内,请求会一直挂起,直到 haproxy 连接超时。

我以为可能是我的应用程序的问题,但我已经能够使用 tomcat 管理器应用程序重现它,并且直接访问 tomcat 没有任何问题。

反复使用 curl 会导致 10-15 次尝试内出现错误

  curl -ikL http://admin:admin@<my server>:81/manager/status

haproxy 在端口 81 上运行,tomcat 在端口 7000 上运行。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 服务器。请求计数没有增加,管理器应用程序仅显示一个线程上的活动,为管理器应用程序提供服务。

这是我的 haproxy 和 tomcat 连接器设置,我对这两者都进行了大量尝试以找出问题所在,因此它们可能不是理想的选择,但它们似乎不应该导致这个错误。

服务器.xml

<Connector 
    port="7000" protocol="HTTP/1.1"
    enableLookups="false" maxKeepAliveRequests="1"
    connectionLinger="10"
/>

haproxy 配置

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

答案1

我怀疑您的 Tomcat 正在暂停以进行完整的垃圾收集,这就是它没有响应或记录任何内容的原因。请参阅这里了解有关此问题的更多信息。

答案2

如果你打开haproxy统计服务器,额外的信息可能会帮助你调试

答案3

好吧,您应该在 haproxy 和 netcat 之间运行 tcpdump 来弄清楚发生了什么。Haproxy 说它没有得到响应,这可能值得商榷,但很明显它已经连接并发送了请求,否则它不可能在等待标头。tomcat 没有看到任何传入请求这一事实令人不安,因为至少我可以接受 haproxy 上的错误导致它在响应上超时,但在这里我们说 tomcat 没有理由响应,因为它不认为它收到了请求。要么是 tomcat 本身有错误,要么是您的网络上出现了异常(同一 IP 上的两个服务器?),因为至少它应该告诉您它收到了连接和请求!Tcpdump 会很容易地解决这个问题。另外,您正在运行哪个版本的 haproxy? 1.3.16 和 1.3.19 之间的版本存在几个问题,其中包括在响应的最后一个数据包上发生随机超时(但这里 tomcat 说它没有响应,但无论如何最好修复问题)。

威利

相关内容