У меня Tomcat работает на порту 8080, и когда я отправляю запрос непосредственно в Tomcat, он отлично работает:
curl -IL http://localhost:8080/myapp
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost:8080/myapp/
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost:8080/myapp/login.html
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
У меня в Apache есть следующая настройка mod_proxy:
ProxyRequests Off
ProxyPreserveHost on
ProxyPass /myapp http://localhost:8080/myapp retry=0
ProxyPassReverse /myapp http://localhost:8080/myapp retry=0
Когда я делаю запрос через прокси, я получаю 404 от Tomcat. В заголовках написано Apache-Coyote, поэтому я знаю, что он проходит через прокси и достигает Tomcat.
curl -LI https://myserver.com/myapp
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Я включил журнал доступа в Tomcat, чтобы узнать, в чем проблема, и журнал доступа Tomcat регистрирует все запросы, которые идут напрямую на порт 8080, но не регистрирует запросы, которые проходят через Apache.
Если Apache искажает запрос или что-то в этом роде, я хотел бы увидеть доказательства этого в журнале Tomcat. Может ли кто-нибудь сказать мне, как заставить Tomcat регистрировать 404-е, которые проходят через прокси, так же, как он регистрирует 404-е, которые не проходят через прокси?
РЕДАКТИРОВАТЬ Я также заметил, что 404 появляется только тогда, когда ProxyPreserveHost on
является частью конфига. Если я удалю его, прокси будет работать точно так, как ожидалось. Но мне нужен прокси, чтобы передать имя хоста Tomcat.
РЕДАКТИРОВАТЬ Я установил LogLevel Debug, который показывает полное прокси-соединение в журнале ошибок. К сожалению, я до сих пор не понимаю, откуда взялся 404, но вот связь:
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(1506): [client 10.100.10.38] proxy: http: found worker http://localhost:8080/myapp for http://localhost:8080/myapp
[Thu Jan 30 11:42:40 2014] [debug] mod_proxy.c(1020): Running scheme http handler (attempt 0)
[Thu Jan 30 11:42:40 2014] [debug] mod_proxy_ajp.c(677): proxy: AJP: declining URL http://localhost:8080/myapp
[Thu Jan 30 11:42:40 2014] [debug] mod_proxy_http.c(1973): proxy: HTTP: serving URL http://localhost:8080/myapp
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2011): proxy: HTTP: has acquired connection for (localhost)
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2067): proxy: connecting http://localhost:8080/myapp to localhost:8080
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2193): proxy: connected /myapp to localhost:8080
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2444): proxy: HTTP: fam 2 socket created to connect to localhost
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2576): proxy: HTTP: connection complete to 127.0.0.1:8080 (localhost)
[Thu Jan 30 11:42:40 2014] [debug] mod_proxy_http.c(1851): proxy: header only
[Thu Jan 30 11:42:40 2014] [debug] proxy_util.c(2029): proxy: HTTP: has released connection for (localhost)
Но мне нужен прокси, чтобы передать имя хоста Tomcat.
Альтернативный ответ. Если бэкэнд заинтересован в оригинале Host:
заголовок, я бы сказал, что лучше модифицировать серверное приложение для обработки X-Forwarded-Host:
заголовок и заставьте apache httpd подготовить такой заголовок (наряду с другими X-Forwarded-*
заголовки).
Таким образом, вам не потребуется URL-адрес браузера и Host:
заголовок, чтобы всегда указывать на одно и то же имя. Другими словами, вы не зависите от ProxyPreserveHost on
больше. Вы также можете использовать несколько имен хостов.
Это не объясняет, почему я получаю 404 с ProxyPreserveHost On
а затем не получить 404 с ProxyPreserveHost Off
, но я нашел обходной путь, который позволяет мне отключить ProxyPreserveHost.
Вместо того, чтобы Apache передавал имя хоста Tomcat, я просто помещаю имя хоста прямо в Tomcat server.xml, как описано в http://tomcat.apache.org/tomcat-6.0-doc/proxy-howto.html.
proxyName="www.mycompany.com"
proxyPort="80"/>
Это не было бы подходящим решением, если бы у меня было много разных имен хостов, проходящих через прокси, но я этого не делаю. Тем не менее, было бы неплохо, если бы кто-нибудь придумал, как разрешить мне включить ProxyPreserveHost.
Если это не копия прошлой ошибки, что ваш «прокси-доступ» осуществляется через https, тогда я предлагаю вам проверить конфигурацию вашего vhost для SSL.
насколько я знаю, вам нужна настройка mod_proxy как в обычной директиве *: 80, так и *: 443 Virtualhost.
так что либо ваша директива Virtualhost не имеет записи, либо вы должны показать нам запись *: 443, чтобы попытаться помочь вам более конкретно.