Как сконфигурировать Apache для проксирования Tomcat с использованием AJP?

Вопрос или проблема

У меня свежая установка 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 для получения более детальной информации о проблемах. Настройка обратного прокси – это мощный инструмент для распределения нагрузки и повышения безопасности ваших приложений, и с правильной конфигурацией вы сможете эффективно управлять запросами и ресурсами.

Оцените материал
Добавить комментарий

Капча загружается...