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

Tomcat не принимает соединения, Apache использует всех доступных рабочих

Мы запускаем два отдельных сервера tomcat (tomcat 7) за балансировщиком нагрузки и Apache (v. 2.2), работающий как прокси (на одном хосте). На каждом сервере работает около 70 микросервисов, доступ к которым осуществляется из удаленной системы Liferay и другого кластера серверов, содержащего сервисы с бизнес-логикой.

Эта проблема: Примерно каждые один-два дня apache, который принимает запросы от балансировщика нагрузки для передачи их на tomcat, внезапно оказывается не в состоянии подключиться и, следовательно, порождает рабочих, пока не достигнет своего предела. Тогда кот полностью недоступен.

Сообщение об ошибке в httpd / error.log выглядит так (повторяется много раз):

[.... 2018] [error] (70007)The timeout specified has expired: 
ajp_ilink_receive() can't receive header

Мы также наблюдали несколько сотен TCP-соединений в статусе CLOSE-WAIT. Как ни странно, мы не наблюдаем сообщений об ошибках на сайте catalina.out. Использование ЦП и памяти серверами находится в пределах экономии.

Мы думаем, что проблема может быть связана с тем, что один из микросервисов не обрабатывает соединения правильно (как мы наблюдали в дампе потока, многие потоки используют HttpClient в состоянии WAITING).

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

Какие-либо предложения? Соответствующая информация о конфигурации ниже:

tomcat server.xml

<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
compression="on"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/css,text/javascript,text/plain"
redirectPort="8443"
URIEncoding="UTF-8"
maxThreads="200"
acceptCount="800"
maxHttpHeaderSize="8192"
maxKeepAliveRequests="-1" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

apache httpd.conf

Timeout 60
RLimitCPU max
RLimitMEM max
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers       16
MinSpareServers    8
MaxSpareServers   20
ServerLimit      350
MaxClients       350
MaxRequestsPerChild  4000
</IfModule>

apache vhosts.conf

ProxyPass / ajp://localhost:8009/ keepalive=on retry=0 timeout=60 ping=120 
connectiontimeout=120