Я пытаюсь поставить сервер 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's 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>
Когда HTTP-клиент запрашивает URL, клиент устанавливает HTTP Host
заголовок - это все, что находится между схемой и путем URI. Так например:
http://www.example.com:1234/path/to/index.html?arg1=value1&arg2=value2
В 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#usage, с участием 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
директивы. т.е. присутствует на обоих или не присутствует на обоих.
Таким образом, покажите, пожалуйста, больше вашей конфигурации