Мы запускаем два отдельных сервера 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