Назад | Перейти на главную страницу

добавление префикса глобального URI для веб-приложений Tomcat

Я настраиваю конфигурацию обратного прокси, где все запросы, путь которых начинается с / apps /, должны быть проксированы Apache в Tomcat. Этот IMO имеет 2 преимущества: он позволяет зарезервировать проксирование только для части '/ apps /' пространства URI и использовать только одно правило прокси для всех приложений Tomcat (т.е. запросы для любого приложения Tomcat должны начинаться с '/Программы/').

Например, запросы на http: // мойдомен / приложения / мое_приложение / должен быть проксирован на http: // локальный: 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: // мойдомен / приложения / мое_приложение / к http: // локальный: 8082 / приложения / 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: // локальный: 8082 / приложения / my_app /, это также предполагает, что все приложения Tomcat должны быть определены вручную в отдельном элементе. Это делает менее гибким добавление новых веб-приложений Tomcat (и фактически означало бы больше работы по настройке, чем объявление отдельных правил прокси для каждого приложения в конфигурации Apache без префикса '/ apps /'). Я пробовал это:

<Context path="/apps" docBase="/" reloadable="true"/>

(и варианты @docBase, такие как «» или «.»), но это не работает: в выводе консоли Tomcat нет указаний на развертывание каких-либо веб-приложений, и все запросы возвращают ошибку 404.

Отсюда мой вопрос: есть ли простой (r) способ «объявить» глобальный префикс URI для веб-приложений Tomcat?

Любой совет очень ценится!

Рон

Ради других я отвечу на свой вопрос. Фактически, Tomcat (начиная с версии 6) предоставляет довольно простое решение для добавления префиксов URI к веб-приложениям, добавляя префикс к папке webapp или имени файла WAR с этим префиксом (или этими префиксами), разделенными хешем. Итак, например:

${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war

... сделает оба доступными через http: // локальный: 8082 / приложения / my_app / и http: // локальный: 8080 / приложения / my_app2 /соответственно, без дальнейшей настройки в $ {catalina.base} /conf/server.xml.

Это несколько загадочно объясняется в Контейнер контекста Tomcat ссылка, но см. это доброе сообщение список рассылки Tomcat-users мне очень помог.

К сожалению, есть загвоздка: очевидно, 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: // локальный: 8082 / приложения / my_CocoonApp /. Это может позволить довольно гибкие накладные расходы на управление веб-приложениями Tomcat:

  • веб-приложения, не основанные на Cocoon: просто добавьте их в appBase хоста, добавив к имени папки или файла WAR желаемый префикс (-а), разделенный хешем (#). Для добавления новых веб-приложений, отличных от Cocoon, не требуется дополнительных действий, кроме их сохранения с желаемым префиксом URI.
  • Веб-приложения на основе кокона: храните их вне appBase хоста, используя только имя веб-приложения без префикса. Кроме того, добавьте файл контекста для каждого веб-приложения на основе Cocoon, указав его, как описано выше. Этот дополнительный шаг нужен только для веб-приложений на основе Cocoon.

С помощью настроек прокси-сервера Apache, описанных в моем исходном вопросе, это позволяет гибко добавлять приложения Tomcat и выполнять их обратное прокси-соединение за Apache с использованием префикса / apps / URI.