Apache + Tomcat: использование mod_proxy вместо AJP

Есть ли способ подключить Apache к Tomcat с помощью прокси-сервера HTTP, чтобы Tomcat получал правильное имя входящего хоста, а не localhost? Я использую эту директиву в apache:

ProxyPass /path http://localhost:8080/path

Но он проходит через localhost, что бесполезно, когда у нас есть несколько сайтов на одном сервере. Я мог бы установить хост вручную в конфигурации сервера:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           proxyName="pretend.host" proxyPort="80" />

Но это опять же не более одного сайта. И мне не нравится идея использовать отдельный внутренний порт для каждого сайта, это звучит ужасно.

Нет возможности перенести порт, когда я проксирую его?

(Если вы спросите, почему я просто не использую AJP, ответ будет этой ошибкой. Я стараюсь изо всех сил, прежде чем полностью отказаться от Tomcat и Apache)


person Marcus Downing    schedule 05.06.2009    source источник


Ответы (3)


Вам нужны следующие настройки:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Обратите внимание, что мы используем localhost в качестве цели прокси. Мы можем это сделать, поскольку мы включили ProxyPreserveHost. В документации указано, что

Это в основном полезно в специальных конфигурациях, таких как виртуальный хостинг на основе прокси-сервера с массовым именем, где исходный заголовок Host должен быть оценен внутренним сервером.

что в точности похоже на то, что вы делаете.

person Robert Munteanu    schedule 07.06.2009
comment
Как бы вы обслуживали статические файлы? Т.е. как бы вы сказали Apache серверу все, что запрашивается от /static, как бы вы установили для этого корень документа? - person Luke; 13.11.2013
comment
@Luke - ProxyPassMatch должен вам помочь: http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypassmatch - person Robert Munteanu; 22.11.2013

Я думаю, что лучший вариант, если вы хотите, чтобы на одном сервере было несколько сайтов, - это использовать виртуальные хосты в конфигурации Apache. Вот пример:

<VirtualHost *:80>
ServerName server.domain.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://server.domain.com:8080/
ProxyPassReverse / http://server.domain.com:8080/
<Location />
    Order allow,deny
    Allow from all
</Location>

As long as you have server.domain.com registered in your external DNS, the incoming host name will be displayed in client URLs. I'm running a single server hosting 6 separate sites, including 3 that are back by Tomcat, using this method.

person gareth_bowles    schedule 05.06.2009
comment
Мы, конечно, используем виртуальные хосты в Apache, но я использовал localhost в директиве ProxyPass. Вместо этого использование соответствующего домена допустимо, но не совсем идеально - оно отменяет домен, на который поступил запрос, и информация, которая затем используется в дальнейшем. - person Marcus Downing; 07.06.2009

Вы все еще можете использовать AJP, и вы должны это сделать, поскольку он быстрее, чем HTTP. Просто не забудьте включить его в http.conf:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

В этом случае у меня работает эта конфигурация:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / ajp://localhost:8080/
# ProxyPassReverse might not be needed,
# it's only for redirecting from inside.
#  ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
person John Mikic    schedule 26.08.2016