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 &quot;%r&quot; %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 директивы. т.е. присутствует на обоих, или нет на обоих.

В итоге, пожалуйста, покажите больше вашей конфигурации.

Другие вопросы по тегам