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

Как создать виртуальный хост в Apache 2.2.x для сопоставления субдомена с контекстом сервлета?

У меня установлен Tomcat 6.x и Apache 2.2.x.

Я хочу сопоставить свои приложения, работающие на tomcat, с поддоменами без необходимости указывать порты и контексты.

Я хочу: http://app1.mycompany.com/ указать на dev.mycompany.com:8080/app1/

Я пробовал создавать записи виртуального хоста, различные комбинации mod_proxy и mod_rewrite и используя ajp но я не могу настроить его для этого.

В итоге я отказался от Apache Tomcat, просто использовал Jetty и сделал приложения своими ROOT контекст приложения. Не оптимально, но он достаточно легкий, пока я не смогу понять, как на самом деле размещать несколько приложений из контейнера сервлетов и беспрепятственно перенаправлять их на поддомены и обратно. Кто-то предложил использовать виртуальные хосты Tomcat непосредственно вне Tomcat в автономном режиме, я тоже исследую это.

Это должно работать:

<VirtualHost 0.0.0.0:80>
    ServerName app1.mycompany.com

    ProxyPass / http://dev.mycompany.com:8080/app1/
    ProxyPassReverse / http://dev.mycompany.com:8080/app1/
</VirtualHost>

Однако обратите внимание, что если сервлет на dev.mycompany.com использует URI запроса для перенаправления браузера или создания ссылки в документе, который Apache не понимает (например, файл JNLP), он не сможет загрузить, потому что это случится:

  1. Сервлет обнаруживает URI, / app1 /
  2. Сервлет генерирует ссылку, например /app1/this_is_needed.jar
  3. Клиент пытается скачать ссылку, http://app1.mycompany.com/app1/this_is_needed.jar
  4. поскольку все запросы перенаправляются на dev.mycompany.com:8080/app1/, запрос становится http://dev.mycompany.com:8080/app1/app1/this_is_needed.jar, которого не существует.

Это не будет применяться к html-страницам, потому что Apache изменит ссылки (для этого и предназначен ProxyPassReverse). Если вам нужно обойти описанную мной ошибку, у вас есть два варианта:

  1. Сообщите веб-приложению о том, что ему, возможно, придется обслуживать пути, отличные от URI запроса. Вам нужно будет найти способ указать эти пути на лету, используя, например, переменные среды (директива SetEnv).
  2. Прокси-сервер всего контекста и в корневом веб-каталоге разместите простую страницу, которая перенаправляет пользователя в / app1 /