Назад | Перейти на главную страницу

Apache ProxyPreserveHost перед 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'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 &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>

Когда 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 = 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 директивы. т.е. присутствует на обоих или не присутствует на обоих.

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