Apache + Tomcat: использование прокси-сервера mod вместо 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 полностью)

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

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

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


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


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