Вопрос или проблема
Я следую этому руководству для настройки Tomcat 8 на Ubuntu Server 16.04, используя модуль mod_jk Apache2 в качестве обратного прокси:
Все работает до последнего шага, который заключается в изменении HTTP и AJP коннекторов в server.xml, чтобы они слушали только на localhost. Вот изменение, которое я сделал в AJP коннекторе:
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
До этого изменения, ввод https://myhostname приводит меня на страницу администрирования Tomcat; после него, я получаю “503 Service Unavailable”. Я временно отключил свой брандмауэр и удалил AppArmor. Вот соответствующая часть mod_jk.log:
jk_open_socket::jk_connect.c (817): connect to ::1:8009 failed (errno=111)
ajp_connect_to_endpoint::jk_ajp_common.c (1068): (ajp13_worker) Failed opening socket to (::1:8009) (errno=111)
ajp_send_request::jk_ajp_common.c (1728): (ajp13_worker) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=111)
Что может быть причиной этого, и как я могу это исправить?
В вашем определении коннектора указано address="127.0.0.1"
.
Сообщение об ошибке показывает ::1:8009
Для меня это выглядит так, будто Tomcat слушает на IPv4 адресе 127.0.0.1, но вы подключаетесь через IPv6 к ::1
Я думаю, это может быть проблемой. Возможно, вы могли бы подключиться напрямую к http://127.0.0.1 и не к https://myhostname. Я предполагаю, что myhostname переводится на IPv6 адрес localhost.
Ответ или решение
Ошибка 503 "Service Unavailable", возникающая при попытке настроить Apache Tomcat 8 с использованием модуля mod_jk в качестве обратного прокси на Ubuntu Server 16.04, может быть связана с неправильной конфигурацией адресов связывания для соединений, что может привести к несоответствиям в сетевых протоколах.
Теория:
Процесс интеграции Apache HTTP Server с Apache Tomcat часто включает использование модуля mod_jk, который позволяет использовать протокол AJP (Apache JServ Protocol) для передачи запросов от веб-сервера к сервлетному контейнеру. При этом адрес прослушивания, указанный в конфигурации вашего сервера Tomcat, должен совпадать с тем, который используется mod_jk для подключения.
В данной ситуации проблема, вероятно, вызвана неспособностью сервера правильно маршрутизировать запросы протокола AJP, что выражается в ошибке 503, сигнализирующей о недоступности службы. Этот сбой может быть связан с различиями в использовании адресов IPv4 и IPv6.
Пример:
Вы изменили директиву AJP Connector в файле server.xml на следующую конфигурацию:
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
После этого приложения, работающие через модуль mod_jk, начинают сообщать об ошибке "503 Service Unavailable". Лог-файлы, ссылающиеся на mod_jk.log, указывают на проблему:
jk_open_socket::jk_connect.c (817): connect to ::1:8009 failed (errno=111)
ajp_connect_to_endpoint::jk_ajp_common.c (1068): (ajp13_worker) Failed opening socket to (::1:8009) (errno=111)
ajp_send_request::jk_ajp_common.c (1728): (ajp13_worker) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=111)
Проблема заключается в том, что модуль пытается подключиться к адресу ::1
, который представляет собой IPv6-эквивалент заставки localhost, тогда как ваш коннектор настроен только на IPv4 адрес 127.0.0.1
. Это своерждает несовпадение протоколов, используемых для соединения, поскольку указанный адрес в конфигурации server.xml поддерживает только IPv4.
Применение:
Вот шаги, которые помогут решить данную проблему:
-
Обновление конфигурации мод_jk:
Убедитесь, что конфигурация mod_jk направлена на использование IPv4. В файле Apache конфигурации workers.properties добавьте или измените строку для указания правильного адреса:worker.ajp13_worker.host=127.0.0.1
-
Модификация /etc/hosts:
Проверьте файл/etc/hosts
, чтобы убедиться, чтоmyhostname
мягко сопоставляется с127.0.0.1
и не указывает на::1
в значениях по умолчанию. -
Проверка IPv4 on mod_jk:
Убедитесь, что ваш файл конфигурации Apache (например, httpd.conf или соответствующие включаемые файлы) настроен для подключения к IPv4, если поддержка IPv6 не требуется:Listen 127.0.0.1:80
-
Перезапуск серверов:
После проведения изменений перезапустите Tomcat и Apache для обновления конфигураций:sudo systemctl restart tomcat sudo systemctl restart apache2
-
Проверка логов:
Проверьте лог-файлы снова для подтверждения, что ошибка устранена и соединения устанавливаются успешно.
Следуя данным рекомендациям, вы сможете устранить ошибку несовпадения адресов в конфигурации соединений AJP, что обеспечит исправную работу вашего приложения в составе сервлетного контейнера и веб-сервера. В контексте системного администрирования такие исправления крайне важны для поддержания стабильности и доступности сервисов, предоставляющих веб-приложения.