ProxyPreserveHost Apache перед tomcat с использованием AJP
Я пытаюсь поставить сервер Apache перед сервером Tomcat. В документации Apache говорится о ProxyPreserveHost
опция: When enabled, this option will pass the Host: line from the incoming request to the proxied host, instead of the hostname specified in the ProxyPass line.
Я построил простой сценарий. Я устанавливаю виртуальный хост в Apache и устанавливаю ServerName
а также ServerAlias
, Я тоже поставил ProxyPreserveHost Off
, Направление запроса инициируется ProxyPass / ajp://tomcat001:8009/
для Tomcat server.xml
имеет линию host name="tomcat001"
, Когда я сейчас звоню tomcat001 - что происходит, если установить ServerName
- в браузере все работает хорошо. Когда я звоню tomcat001a
- хост, который установлен как ServerAlias - Tomcat сообщает, что вызываемый файл не существует в /ROOT
- это означает, что он называет сайт Tomcat по умолчанию.
Теперь мне интересно, что означает документация Apache под hostname specified in the ProxyPass line
? Разве они не имеют в виду целевой сайт? Я ожидаю, что хост tomcat, предоставленный там, будет вызван, под каким именем хоста он когда-либо достиг Apache.
Дополнение: 20161023
HTTPD-vhosts.conf
<VirtualHost *:80>
DocumentRoot "D:/Webs/tomcat001"
ServerName tomcat001
ServerAlias tomcat001a
LogLevel debug rewrite:trace3
<Directory "D:/Webs/tomcat001">
AllowOverride All
Require all granted
DirectoryIndex index.cfm
OPTIONS +indexes
</Directory>
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass / ajp://tomcat001:8009/
ProxyPassReverse / http://tomcat001:8009/
</VirtualHost>
server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="tomcat001" appBase="webapps" autoDeploy="true" unpackWARs="true">
<Context path="" docBase="D:/Webs/tomcat001">
<JarScanner scanClassPath="false"/>
</Context>
</Host>
1 ответ
Когда клиент HTTP запрашивает URL, клиент устанавливает HTTP Host
заголовок должен быть всем между схемой и путем URI. Так, например:
http://www.example.com:1234/path/to/index.html?arg1=value1&arg2=value2
- схема = http
- имя хоста = www.example.com
- порт = 1234
- Путь URI = /path/to/index.html
- Строка запроса = arg1= значение1&arg2= значение2
Host
заголовок в этом случае будет www.example.com:1234
,
При использовании прокси-сервера HTTP по умолчанию заголовок узла, который устанавливает Apache (Apache является клиентом в ситуации обратного прокси-сервера), будет соответствующей частью URL-адреса в ProxyPass
линия. Так что, если у вас было:
ProxyPass / http://mytomcatapp:8009/
Запросы к вашему бэкэнду будут содержать заголовок хоста со строкой mytomcatapp:8009
, Однако для AJP
Прокси это не по умолчанию. Согласно документации, https://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html, с AJP
, Host
заголовок сохраняется по умолчанию, и поэтому в вашем случае это будет то, что браузер пользователей установил.
Это может быть проблема контекста tomcat, но вам нужно будет показать больше своей конфигурации, чтобы быть уверенным. В общем случае URI, к которому вы проксируете приложение, должен иметь тот же путь URI, под которым развернуто приложение. Дело не в том, что это требуется, просто это позволяет избежать множества возможных проблем. Так:
# Good
ProxyPass / http://backend.example.com:8080/
ProxyPass /app1/ http://backend.example.com:8080/app1/
# Not so good
ProxyPass / http://backend.example.com:8080/app1/
ProxyPass /app1/ http://backend.example.com:8080/
Вы также должны быть осторожны, чтобы соответствовать косой черты в аргументах ProxyPass
а также ProxyPassReverse
директивы. т.е. присутствует на обоих, или нет на обоих.
В итоге, пожалуйста, покажите больше вашей конфигурации.