Добавление глобального префикса URI для веб-приложений Tomcat
Я настраиваю конфигурацию обратного прокси, где все запросы, путь которых начинается с '/ apps /', должны быть перенаправлены Apache на Tomcat. У этого IMO есть 2 преимущества: он позволяет зарезервировать прокси только для части '/ apps /' пространства URI и использовать только одно правило прокси для всех приложений Tomcat (т.е. запросы на любое приложение Tomcat должны начинаться только с '/Программы/').
Например, запросы на http://mydomain/apps/my_app/ должны быть перенаправлены на http://localhost:8082/my_app/. Обратите внимание на отсутствие префикса "/ apps /" в URI Tomcat: "my_app" находится в обычном каталоге ${CATALINA_HOME}/webapps/my_app.
Я добился этого, используя следующие правила прокси в файле Apache vhost.conf:
ProxyPreserveHost on
ProxyPass /apps/ http://localhost:8082/
ProxyPassReverse /apps/ http://mydomain/
(Примечание. Я использовал ProxyPreserveHost, поскольку моему приложению Tomcat необходим доступ к исходному хосту для создания дальнейших ссылок). Все идет хорошо, за исключением абсолютных ссылок, которые генерируются одной частью моего приложения Tomcat. Учитывая приведенную выше конфигурацию, мое приложение Tomcat "увидит" этот запрос: http://mydomain/my_app и, следовательно, сгенерирует ссылки без префикса "/ apps /", которые должны запускать прокси для этих ссылок.
Это заняло у меня некоторое время, но теперь я понимаю, что это важная характеристика прокси и что не существует "стандартного" способа передачи префикса "/ apps /" исходного запроса прокси-приложению. Поэтому я начал исследовать другую возможность, а именно определение глобального префикса для всех приложений Tomcat и прокси приложений Tomcat со следующими настройками:
ProxyPreserveHost on
ProxyPass /apps/ http://localhost:8082/apps/
ProxyPassReverse /apps/ http://mydomain/apps/
Это будет прокси-запросы для http://mydomain/apps/my_app/ на http://localhost:8082/apps/my_app/. Поскольку все приложения на сервере Tomcat будут доступны через прокси-сервер, у меня нет проблем с тем, что этот префикс '/ apps /' потребуется для всех приложений Tomcat.
Все идет нормально. Тем не менее, я борюсь со стороной Tomcat этого подхода: найти способ добавить префикс глобального пути для запросов к приложениям Tomcat. Самое близкое, что я получил, это: 1. не трогайте физическое расположение приложений Tomcat: оставьте их в ${CATALINA.HOME}/webapps 2. измените ${CATALINA.HOME}/conf/server.xml следующим образом:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
<Context path="/apps/my_app" docBase="/my_app/" reloadable="true"/>
</Host>
Хотя это делает приложение my_app Tomcat доступным по адресу http://localhost:8082/apps/my_app/, оно также предполагает, что все приложения Tomcat должны быть определены вручную в отдельном элементе. Это делает менее гибким добавление новых веб-приложений Tomcat (и фактически будет означать больше работы по настройке, чем объявление отдельных правил прокси-сервера для каждого приложения в конфигурации Apache без префикса / apps /). Я попробовал это:
<Context path="/apps" docBase="/" reloadable="true"/>
(и варианты @docBase, такие как "" или "."), но это не работает: нет указаний на развертывание каких-либо веб-приложений в выходных данных консоли Tomcat, и все запросы возвращают ошибку 404.
Отсюда мой вопрос: существует ли простой (r) способ "объявления" глобального префикса URI для веб-приложений Tomcat?
Любой совет высоко ценится!
Рон
1 ответ
Для блага других я отвечу на свой вопрос. На самом деле Tomcat (начиная с версии 6) предоставляет довольно простое решение для добавления префиксов URI в веб-приложения путем добавления префикса папки веб-приложения или файла WAR с этим префиксом (или этими префиксами), разделенными хешем. Так, например:
${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war
... сделает доступными оба через http://localhost:8082/apps/my_app/ и http://localhost:8080/apps/my_app2/, соответственно, без дальнейшей настройки в ${catalina.base}/conf/server.xml.
Это несколько загадочно объясняется в справочнике контейнера контекста Tomcat, но вид такого доброго сообщения в списке рассылки пользователей Tomcat мне очень помог.
К сожалению, есть одна загвоздка: очевидно, Cocoon (до 2.1.11, не тестировался с приложениями 2.2) блокирует веб-приложения, пути которых содержат хэш (см. https://issues.apache.org/jira/browse/COCOON-2270).
Тем не менее, есть обходной путь для тех веб-приложений на основе Cocoon, как показано в следующих шагах настройки:
- переместите папку или файл WAR, содержащий веб-приложение, за пределы пути appBase хоста, например: F:\cocoonApps\my_CocoonApp
добавьте файл ${catalina.base}\conf\Catalina[имя хоста][префикс]#[имя приложения].xml, например: ${catalina.base}\conf\Catalina\localhost\apps#my_CocoonApp.xml, с следующее содержание:
<Context docBase="F:/cocoonApps/my_CocoonApp"/>
Используя этот обходной путь, даже веб-приложения Cocoon счастливы, когда к ним обращаются, например, по http://localhost:8082/apps/my_CocoonApp/. Это может позволить довольно гибкие затраты на управление веб-приложениями Tomcat:
- веб-приложения не на основе Cocoon: просто добавьте их в appBase хоста, добавив префикс имени папки или файла WAR с нужным префиксом (ами), разделив их хешем (#). Добавление новых веб-приложений, не относящихся к Cocoon, не требует никаких дополнительных шагов, кроме их сохранения с нужным префиксом URI.
- Веб-приложения на основе кокона: храните их вне базы приложения хоста, используя только имя веб-приложения без префикса. Кроме того, добавьте файл контекста для каждого веб-приложения на основе Cocoon, указав веб-приложение, как описано выше. Этот дополнительный шаг необходим только для веб-приложений Cocoon.
С настройками прокси-сервера Apache, описанными в моем первоначальном вопросе, это позволяет гибко добавлять приложения Tomcat и использовать их для обратного прокси-подключения за Apache с использованием префикса /apps/ URI.