Использование Apache httpd в качестве прокси-сервера для контейнера приложений Apache Tomcat является обычной установкой. Он поставляется со многими вариантами использования, самым простым из которых является обслуживание статического контента httpd, а также предоставление сервисов, реализующих сложную бизнес-логику, из приложения, написанного на Java, которое находится в контейнере Tomcat.
Создав прокси, мы можем создать своего рода интерфейс для уровня приложений, где мы можем ввести меры безопасности в веб-сервере, применить балансировку нагрузки, использовать условное перенаправление или использовать любые другие функции, предоставляемые веб-сервером. Таким образом, нам не нужно реализовывать какие-либо из этих функций в нашем приложении, и мы можем сфокусировать их возможности на самом сервисе. У нас будет представлен полнофункциональный веб-сервер для пользователей, некоторые URL-адреса которого будут перенаправлены в контейнер приложения, которые могут быть недоступны сами по себе. Ответы приложения отправляются обратно клиентам, которые не будут знать, что они говорили что-то еще, кроме веб-сервера, то есть, если мы позаботимся о том, чтобы не раскрывать какую-либо информацию (например, необработанные сообщения об ошибках) из приложения, которая может заставить их догадаться, что есть более чем один слой.
Мы будем использовать протокол AJP, который можно использовать между веб-серверами и контейнерами приложений на основе Java, чтобы обеспечить возможность балансировать нагрузкой между несколькими серверами приложений, однако настройка балансировщика нагрузки выходит за рамки данного руководства.
Мы настроим нашу настройку на Red Hat Linux 7.5, но веб-сервер Apache, модуль AJP и контейнер приложений Apache Tomcat доступны везде, и, таким образом, эта установка переносима с небольшими изменениями, такими как пути файловой системы или имена служб.
Установка необходимого программного обеспечения
Сначала нам нужно установить сервисы, которые мы будем использовать. При настройке с балансировкой нагрузки сервер(ы) Tomcat могут находиться на разных компьютерах, и часто они предоставляют ферму контейнеров, которые создают сервис.
# yum install httpd tomcat tomcat-webapps
Мы устанавливаем tomcat-webapps для целей тестирования, в этом пакете есть примеры веб-приложений, развернутых на нашем сервере Tomcat при установке. Мы будем использовать это приложение, чтобы проверить, что наша установка работает как задумано.
Теперь мы можем включить и запустить наш сервер Tomcat:
# systemctl enable tomcat
# systemctl start tomcat
И наш веб-сервер:
# systemctl enable httpd
# systemctl start httpd
Установка по умолчанию httpd содержит нужные нам прокси-модули. Чтобы убедиться, что это так, мы можем запросить веб-сервер с помощью apachectl:
# apachectl -M | grep ajp
proxy_ajp_module (shared)
1.x версии Apache используют mod_jk модуль вместо proxy_ajp.
Конфигурация httpd
Примеры веб-приложений, развернутых в Tomcat, по умолчанию публикуются после установки server-url:8080/examples. Мы будем отправлять прокси-запросы, поступающие на порт 80 сервера (порт http по умолчанию), запрашивающие что-либо из того, что в server-url/examples должно быть обработано examples веб-приложением, развернутым в Tomcat. Запросы, поступающие на любой другой URL на сервере, будут обслуживаться веб-сервером. Мы настроим некоторый статический контент, чтобы показать эту функциональность.
В нашем примере сервер называется ws.foobar.com. Чтобы прокси работал, создайте текстовый файл с вашим любимым редактором в каталоге конфигурации выпадающего веб-сервера, который находится /etc/httpd/conf.d в версиях Red Hat, с расширением .conf. Нашей установке не требуется, чтобы Tomcat был доступен напрямую, поэтому мы используем в localhost в качестве целевого хоста /etc/httpd/conf.d/example_proxy.conf файл:
<VirtualHost ws.foobar.com:80>
ServerName ws.foobar.com
ProxyRequests Off
ProxyPass /examples ajp://localhost:8009/examples
ProxyPassReverse /examples ajp://localhost:8009/examples
</VirtualHost>
Чтобы быть в безопасности, мы можем проверить правильность нашей конфигурации перед применением с apachectl:
# apachectl configtest
Syntax OK
Если тест конфигурации возвращает ошибку, подобную следующей:
Could not resolve host name ws.foobar.com -- ignoring!
Это означает, что наша ServerName директива недействительна, так как она не может быть разрешена веб-сервером. Либо нам нужно зарегистрировать его в (локальном или глобальном) DNS, либо указать в /etc/hosts файле строку, содержащую публичный IP-адрес хоста, за которым следует имя, которое мы дали в приведенной выше конфигурации. Если файл hosts уже содержит IP с другим именем (может быть, реальным именем хоста), мы можем добавить имя сервера после имени хоста (ов) в той же строке, настройка будет работать.
После успешного тестирования нам нужно применить новую конфигурацию, перезапустив веб-сервер:
# systemctl restart httpd