Вопрос или проблема
У меня свежая установка Fedora 23 (Workstation) с новыми установками Apache 2.4 и Tomcat 8.
Я пытаюсь настроить очень простую конфигурацию: один экземпляр Apache будет проксировать весь трафик для одного экземпляра Tomcat.
В httpd.conf
Apache я установил ServerName localhost
. Он включает файл конфигурации прокси conf.modules.d/00-proxy.conf
. В этом файле,
mod_proxy
и mod_proxy_ajp
активированы с настройкой
ProxyRequests Off
<Proxy *>
Order deny,allow
Deny from all
Allow from localhost
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
По моему пониманию, это говорит Apache передавать все запросы тому, что слушает на локальном порту 8009 через AJP, позволяя только запросы от localhost
и сохраняя все относительно соответствующих корневых директорий.
В /etc/tomcat/server.xml
Tomcat у меня есть
<!-- Определить AJP 1.3 Connector на порту 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
что, по моему пониманию, говорит Tomcat слушать на порту 8009 для всего, что отправляется через AJP. Учитывая конфигурацию Apache, это должен быть каждый запрос, который получает Apache.
Проблема
Доступ к localhost
возвращает ошибку 403 Запрещено. Если я подключаюсь к Tomcat напрямую по localhost:8080
, соединение в порядке, и я получаю index.jsp
. В журнале ошибок Apache указано
AH01630: client denied by server configuration: proxy:ajp://localhost:8009/favicon.ico
что указывает на то, что Apache запрещает доступ к директории Tomcat /tomcat/webapps/ROOT/
из-за конфликта разрешений. Я попробовал добавить
<Directory "/var/lib/tomcat/webapps/ROOT">
AllowOverride None
# Разрешить открытый доступ:
Require all granted
</Directory>
в httpd.conf
, но это не изменило ошибку 403 Запрещено после перезапуска Apache.
Это очень распространённая настройка, и ни одно из многих, многих руководств, которые я читал, не указывает на необходимость изменения разрешений доступа Apache или разрешений файловой системы ОС. Это чистая установка, и я сделал очень немного с установкой, что я не отметил здесь.
Что я не понимаю?
Вам следует изменить ваш коннектор вот так.
<!-- Определить не-SSL HTTP/1.1 Connector на порту 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
<Connector port="8009" URIEncoding="UTF-8" enableLookups="false" protocol="AJP/1.3" />
Вы также можете следовать этой ссылке: https://confluence.sakaiproject.org/display/~steve.swinsburg/Fronting+Tomcat+with+Apache+via+mod_proxy_ajp
Конструкция <Proxy *>
не требуется для конфигурации обратного прокси, такой как у вас здесь. Эта конструкция часто встречается в руководствах в интернете, но я боюсь, что они просто ошибаются.
Если вы хотите ограничить доступ к проксируемому ресурсу, используйте блок <Location>
, а не <Proxy>
. Так что если бы у вас было что-то вроде
<Location "https://serverfault.com/">
Order deny,allow
Deny from all
Allow from localhost
</Location>
это бы сделало то, что вам нужно. Но попробуйте сначала без этого, так как это почти наверняка и вызывает вашу ошибку 403. Приведенная выше конфигурация означает, что только запросы к вашему веб-серверу, начинающиеся с http://localhost
, будут работать,
Ответ или решение
Чтобы настроить Apache для проксирования Tomcat с использованием AJP, важно учесть несколько ключевых аспектов конфигурации. Рассмотрим подробно, как это сделать на примере вашей установки Fedora 23, Apache 2.4 и Tomcat 8.
Шаг 1: Конфигурация Tomcat
Включите AJP соединение в файле конфигурации Tomcat (/etc/tomcat/server.xml
). Убедитесь, что ваш коннектор AJP настроен следующим образом:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Эта настройка позволяет Tomcat принимать запросы по AJP на порту 8009. Удостоверьтесь, что данный порт не заблокирован фаерволом и доступен для Apache.
Шаг 2: Настройка Apache для проксирования
В файле Apache httpd.conf
нужно использовать модули mod_proxy
и mod_proxy_ajp
. Убедитесь, что они подключены в файле conf.modules.d/00-proxy.conf
, как вы уже сделали. Однако, в вашем текущем конфигурационном файле присутствует блок <Proxy *>
, который не нужен для обратного проксирования. Вместо этого рекомендую использовать блок <Location>
. Ваша настройка может выглядеть следующим образом:
ProxyRequests Off
<Location />
Require all granted
</Location>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
Объяснение конфигурации
ProxyRequests Off
: это отключает режим прокси-сервера, что необходимо для обратного проксирования.<Location />
: позволяет всем запросам обращение к Tomcat через Apache, избегая ошибок 403. Это важно, если ранее вы использовали блок<Proxy *>
, который ограничивал доступ.ProxyPass
иProxyPassReverse
: эти директивы указывают, что все запросы к Apache (наступившие на корень/
) будут переданы Tomcat через протокол AJP.
Шаг 3: Проверка разрешений
Если вы всё еще сталкиваетесь с ошибками доступа (например, 403 Forbidden), убедитесь в корректности конфигурации прав доступа на стороне Apache. Ваши настройки в секции <Directory>
не обязательны, но если хотите уточнить, они должны выглядеть следующим образом:
<Directory "/var/lib/tomcat/webapps/ROOT">
AllowOverride None
Require all granted
</Directory>
Имейте в виду, что это важно только в случае, если вы ожидаете прямого доступа к файлам из вашей webapp.
Шаг 4: Перезапуск сервисов
После изменения конфигурации Apache и Tomcat обязательно перезапустите оба сервера, чтобы изменения вступили в силу:
systemctl restart httpd
systemctl restart tomcat
Шаг 5: Тестирование
Теперь вы можете протестировать вашу настройку. Перейдите в браузере по адресу http://localhost/
. Вы должны увидеть страницу, предоставляемую Tomcat, без ошибок 403.
Заключение
Следуя вышеприведённым шагам, вы сможете успешно настроить Apache для проксирования Tomcat с использованием AJP. Если возникнут дополнительные проблемы, проверьте журналы ошибок Apache (/var/log/httpd/error_log
) и Tomcat для получения более детальной информации о проблемах. Настройка обратного прокси – это мощный инструмент для распределения нагрузки и повышения безопасности ваших приложений, и с правильной конфигурацией вы сможете эффективно управлять запросами и ресурсами.