Как мне заставить tomcat 5.5 работать под Apache 2 с mod_rewrite, передающим запросы к mod_jk и удаляющим контекст приложения?
-
03-07-2019 - |
Вопрос
Итак, я хочу, чтобы веб-приложение, работающее в Tomcat (5.5), работало на Apache 2 (точнее, 2.2.3), обслуживающем из корня сайта (т. е.без контекста), при этом статический контент обслуживается через Apache.
Итак, если приложение работает под управлением "/myapp
" на tomcat я хочу использовать Apache (плюс mod_rewrite
), чтобы он вел себя так, как будто он работает под управлением "/
" вместо.
Mod_jk
настроен и работает нормально.Я могу получить доступ к приложению из "/myapp
", но я не могу заставить работать последний бит.Ниже приведена конфигурация, для которой я получил mod_rewrite
чтобы попытаться заставить это работать.Он правильно перезаписывается /static/
URL-адреса, чтобы Apache мог обслуживать их из распакованного веб-приложения, и если я включу журнал перезаписи, я увижу, что он пытается пройти через все остальные запросы к /myapp
с помощью mod_jk
.Однако похоже, что mod_jk впоследствии не обрабатывает запрос.
JkMount /myapp/* worker1
RewriteEngine On
# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]
Когда я делал это с Apache 1 в прошлом, мне нужно было убедиться, что mod_jk
загрузись раньше mod_rewrite
, но я не могу добиться этого под Apache 2.Есть предположения?Как другие люди обычно это делают?
Решение
В конце концов удалось заставить это работать.Похоже, мне нужно установить JkOption на:
JkOptions +ForwardURICompat
А потом mod_jk
смотрит на переписанный URL.Должен признать, что я не уверен на 100%, почему это работает, но я считаю, что это возвращается к более старой форме поведения.Если кто-нибудь может сказать мне лучший/более правильный способ сделать это, я хотел бы знать.
Другие советы
Возможно, лучше использовать Apache для прокси вместо mod_jk.Что-то вроде этого:
ПроксиПасс /статический/ http://localhost:8080/myapp/static/
Возможно, будет проще и прозрачнее, что произойдет, если вы используете виртуальные хосты Tomcat или разные соединители для разных хостов и просто развертываете корневые приложения (в «/») и настраиваете пересылку Apache mod_jk на разные соединители или виртуальные хосты.
Примечание:Когда мне это было нужно, я работал с разными соединителями для разных хостов или движков Tomcat (не помню) и развертывал ROOT-приложения.Я никогда не пробовал виртуальные хосты (на основе имени) в Tomcat, только предполагая, что это может сработать.
Выгода:нет преобразования пути, поэтому его намного легче понять, если вам придется внести изменения в установку через несколько месяцев после первоначального развертывания.
Признаюсь, это кажется несколько странным, но читабельность для меня многого стоит.
Мы используем флаг «R» вместо «PT»:
RewriteRule ^/(.*)$ /myapp/$1 [L,R]
Редактировать:Я упустил момент, чтобы не изменять URL-адрес, который видит пользователь.Альтернативный способ:
JkMount /* worker1
JkUnmount /static/* worker1
Тогда вам не понадобятся RewriteRule.
И согласно Сайт Apache Tomcat новые настройки по умолчанию mod_jk
несовместимы с mod_rewrite
и вам следует использовать +ForwardURICompatUnparsed
.