Добавление глобального префикса 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, как показано в следующих шагах настройки:

  1. переместите папку или файл WAR, содержащий веб-приложение, за пределы пути appBase хоста, например: F:\cocoonApps\my_CocoonApp
  2. добавьте файл ${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.

Другие вопросы по тегам