Назад | Перейти на главную страницу

прерывистые зависания haproxy и tomcat

Я пытаюсь запустить haproxy перед tomcat в системе Solaris x86, но периодически возникают сбои. С кажущимися случайными интервалами запрос просто зависает, пока 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, я много играл с обоими, пытаясь решить проблему, поэтому они могут быть не идеальными, но они определенно не кажутся такими, как будто они должны вызывать эту ошибку.

server.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

Я подозреваю, что ваш Tomcat делает паузу для полной сборки мусора, поэтому он не отвечает и ничего не регистрирует. Видеть Вот для получения дополнительной информации по этой проблеме.

Что ж, вам следует запустить tcpdump между haproxy и netcat, чтобы выяснить, что происходит. Haproxy говорит, что не получил ответа, что можно опровергнуть, но очевидно, что он подключился и отправил запрос, иначе он не может ждать заголовка. Тот факт, что tomcat не видит никаких входящих запросов, вызывает беспокойство, потому что, по крайней мере, я мог бы принять ошибку на haproxy, вызывающую тайм-аут ответа, но здесь мы говорим, что tomcat не имеет причин отвечать, потому что он не считает это получил запрос. Либо есть ошибка в самом tomcat, либо что-то странное в вашей сети (два сервера на одном IP?), Потому что, по крайней мере, он должен сообщить вам, что получил соединение и запрос! Tcpdump легко с этим справится. Кроме того, на какой версии haproxy вы работаете? в версиях между 1.3.16 и 1.3.19 было несколько проблем, среди которых случайный тайм-аут, возникающий в последнем пакете ответа (но здесь tomcat говорит, что он не ответил, но в любом случае лучше все исправить).

Вилли

Если вы включите сервер статистики haproxy, дополнительная информация может помочь вам отладить