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