Как заставить tomcat 5.5 работать за apache 2 с mod_rewrite, передавая запросы к mod_jk и удаляя контекст приложения?

Хорошо, поэтому я хочу, чтобы веб-приложение, работающее в tomcat (5.5), работало за apache 2 (точнее, 2.2.3), обслуживающим из корня сайта (т.е. без контекста), со статическим контентом, обслуживаемым через apache.

Поэтому, если приложение работает под «/myapp» на tomcat, я хочу использовать apache (плюс mod_rewrite), чтобы оно вело себя так, как будто вместо этого оно работает под «/».

Mod_jk настроен и работает нормально. Я могу получить доступ к приложению из "/myapp", но я не могу заставить работать последний бит. Ниже приведена конфигурация, которую я получил для mod_rewrite, чтобы попытаться заставить ее работать. Он правильно переписывает URL-адреса /static/, чтобы заставить 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. Есть какие-нибудь мысли? Как это обычно делают другие люди?


person John Montgomery    schedule 16.10.2008    source источник
comment
Apache 2.2 (я обновлю вопрос, чтобы упомянуть об этом)   -  person John Montgomery    schedule 16.10.2008


Ответы (4)


В конце концов удалось заставить это работать. Похоже, мне нужно установить JkOption на:


JkOptions     +ForwardURICompat

А затем mod_jk смотрит на переписанный URL. Должен признать, что не уверен на 100%, почему это работает, но я считаю, что это возвращается к старой форме поведения. Если кто-нибудь может сказать мне лучший/более правильный способ сделать это, я хотел бы знать.

person John Montgomery    schedule 16.10.2008

Может быть лучше использовать Apache для прокси вместо mod_jk. Что-то вроде этого:

ProxyPass /static/ http://localhost:8080/myapp/static/

person Community    schedule 24.11.2008

Возможно, будет проще или прозрачнее, что произойдет, если вы используете виртуальные хосты Tomcat или разные коннекторы для разных хостов и просто развертываете корневые приложения (в «/») и настраиваете пересылку Apache mod_jk на разные коннекторы или виртуальные хосты.

Примечание. Когда мне это было нужно, я работал с разными коннекторами для разных хостов или двигателей tomcat (не помню) и развертывал приложения ROOT. Я никогда не пробовал виртуальные хосты (на основе имени) в tomcat, только предполагая, что это может работать.

Преимущество: нет преобразования пути, поэтому его намного легче понять, если вам нужно внести изменения в установку через несколько месяцев после первоначального развертывания.

Признаюсь, это несколько странно, но читабельность для меня дорогого стоит.

person Olaf Kock    schedule 19.10.2008

Мы используем флаг «R» вместо «PT»:

RewriteRule ^/(.*)$ /myapp/$1 [L,R]

Изменить: я упустил момент, чтобы не изменять URL-адрес, который видит пользователь. Альтернативный способ:

JkMount /* worker1
JkUnmount /static/* worker1

Тогда вам не понадобятся правила перезаписи.

Согласно сайту Apache Tomcat, новые настройки по умолчанию для mod_jk несовместимы с mod_rewrite и вы должны использовать +ForwardURICompatUnparsed.

person Leonel Martins    schedule 16.10.2008
comment
Это просто сделает перенаправление, поэтому конечный URL-адрес (который видит пользователь) с /myapp в начале tge. По сути, я пытаюсь заставить mysite.com работать, а не перенаправлять пользователя на mysite.com/myapp (что немного некрасиво). - person John Montgomery; 16.10.2008