Подтвердить что ты не робот

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 полностью)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Вы все еще можете использовать 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 only for redirecting from inside.
#  ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>