Обратный прокси-сервер Apache2 периодически зависает при проксировании веб-приложения Tomcat.
Проблема в том, что время от времени (один или два раза в день, обычно после бездействия), когда я пытаюсь войти в это проксированное веб-приложение, оно просто зависает. Приложение просто зависает на неопределенный срок, нет кода ответа 500 ... браузер просто ждет и ждет.
Если я буду продолжать пытаться намекать на веб-адрес в моем браузере, он в конечном итоге просто снова начнет работать.
Я попытался воспроизвести эту проблему, перейдя непосредственно в веб-приложение через порт 8080 tomcat, но мне никогда не удавалось воспроизвести это без прохождения через обратный прокси.
Вот моя конфигурация обратного прокси ... какие-нибудь идеи по поиску неисправностей? Спасибо
/ и т.д. / apache2 / сайты-доступные / по умолчанию
ProxyPass /manage/ http://localhost:8080/manage/
ProxyPassReverse /manage/ http://localhost:8080/manage/
ProxyPass /manage http://localhost:8080/manage
ProxyPassReverse /manage http://localhost:8080/manage
/etc/apache2/mods-available/proxy.conf
<IfModule mod_proxy.c>
#turning ProxyRequests on and allowing proxying from all may allow
#spammers to use your proxy to send email.
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
Allow from all
</Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
ProxyVia On
</IfModule>
Больше информации: (не уверен, если актуально)
Включенные модули apache:
core_module (статический) log_config_module (статический) logio_module (статический) mpm_worker_module (статический) http_module (статический) so_module (статический) alias_module (общий) auth_basic_module (общий) authn_file_module (общий) authz_default_module (общий) authz_default_module_module) authz_default_module (общий) authz_default_module_module) authz_default_module общий) autoindex_module (общий) cgid_module (общий) deflate_module (общий) dir_module (общий) env_module (общий) mime_module (общий )gotiation_module (общий) proxy_module (общий) proxy_ajp_module (общий) proxy_connect_module (общий) proxy_module (общий) proxy_connect_module (shared) rewrite_module (общий) setenvif_module (общий) status_module (общий)
Обновить: Сейчас я использую протокол ajp для прокси. Установили дополнительную конфигурацию ProxyPass, например.
ProxyPass /manage ajp://localhost:8009/manage max=20 ttl=120 acquire=10000 retry=0
ProxyPassReverse /manage ajp://localhost:8009/manage
Убедитесь, что ваш файловый кеш apache отключен.
# LoadModule file_cache_module modules/mod_file_cache.so
Если это не решит проблему (не должно, это не похоже на проблему с кешем), попробуйте отладить с помощью mod_jk. Загрузите подходящую версию mod_jk для вашего Apache, настройте ее и установите уровень журнала на DEBUG.
# Set the jk log level [debug/error/info]
JkLogLevel debug
Кроме того, включите тонны информации в свои журналы apache
LogFormat "%h %l %u %t \" %m \"%V\" \"%r \" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D CustomLogFormat
. . .
CustomLog "|C:/Apache2/bin/rotatelogs.exe C:/Apache2/logs/access_%Y%m%d.log 86400" CustomLogFormat
Теперь у вас должен быть журнал Apache с микросекундами, затраченными на обслуживание страницы, и журнал уровня отладки вашего соединения AJP 1.3 с tomcat (с mod_jk).
Сделав это, перезапустите apache и попробуйте вызвать ошибку зависания. Когда происходит ошибка, проверьте время и просмотрите журналы, чтобы узнать, что произошло в этот момент, сколько времени apache потратил на обработку и так далее.
Это ничего не решит, но, скорее всего, даст вам некоторое представление о том, что происходит.
Я бы попытался использовать ajp для подключения к tomcat из apache.
Пожалуйста, проверьте конфигурацию с помощью mod_proxy_ajp с Tomcat.
Из журналов похоже, что tomcat не ответил на запрос apache. Он отказался от связи.
Если у вас высокий трафик, ищите глубже в журналах вашего приложения. Это может быть тупик или достигнуто максимальное количество потоков.
HTH
Если вы получаете отказ в соединении, возможно, вы достигли максимального числа потоков на Tomcat. Что установлено в maxclient для Apache? Какой параметр maxthread установлен на Tomcat? Вы хотите убедиться, что ваш maxclient не превышает maxthread. В противном случае Apache попытается проксировать больше соединений, чем может обслужить Tomcat, а Tomcat откажется от соединений.
Также если вы retry=0
до конца ваших операторов ProxyPass. Apache не отключит серверного воркера, и ваше восстановление при возникновении этой проблемы будет быстрее.