Apache + Tomcat: использование mod_proxy вместо AJP - PullRequest
20 голосов
/ 05 июня 2009

Есть ли способ подключить 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 )

Ответы [ 3 ]

38 голосов
/ 08 июня 2009

Настройки, которые вы ищете:

<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 . В документации указано, что

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

, который звучит так же, как то, что вы делаете.

5 голосов
/ 05 июня 2009

Я думаю, что вам лучше всего использовать несколько сайтов на одном сервере, чтобы использовать виртуальные хосты в конфигурации 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>

Пока вы регистрируете server.domain.com во внешнем DNS, имя входящего хоста будет отображаться в URL-адресах клиента. Я использую один сервер, на котором размещены 6 отдельных сайтов, в том числе 3, которые были возвращены Tomcat, используя этот метод.

0 голосов
/ 26 августа 2016

Вы все еще можете использовать 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>
...