ProxyPass, ProxyReverse против AJP
Вопрос
В настоящее время у меня есть настройка HTTP-сервера Tomcat + Apache для обслуживания моего Java-сервлета:
ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice
Все это прекрасно, за исключением того, что myservice
необходимо знать IP-адрес клиента, который всегда оказывается 127.0.0.1 из-за прокси.Есть ли решение для получения реального IP-адреса?Является ли AJP вариантом?
doGet(HttpServletRequest request, HttpServletResponse response){
request.getRemoteAddr()
}
Решение
Сделай это вот так:
в конфигурации apache:
<Location /foo>
ProxyPass ajp://localhost:8009/foo
ProxyPassReverse ajp://localhost:8009/foo
</Location>
И тогда в вашем server.xml:
<Connector port="8009"
enableLookups="false" secure="true" URIEncoding="UTF-8"
tomcatAuthentication="false"
protocol="AJP/1.3" />
Это должно пройти через все.Протокол AJP передает информацию, но http:не делает.
Возможно, вам не нужен secure ="true", я использую это, потому что SSL обрабатывается на уровне apache, и мне нужно, чтобы tomcat знал, что соединение следует считать безопасным.
Другие советы
Вы можете прочитать X-Forwarded-For в заголовке запроса.
Из Документация Apache mod_proxy:
При работе в режиме обратного прокси (например, с использованием директивы ProxyPass) mod_proxy_http добавляет несколько заголовков запроса для передачи информации на исходный сервер.Эти заголовки являются:
- X-Пересланный-Для:IP-адрес клиента.
- X-Перенаправленный Хост:Исходный хост, запрошенный клиентом в заголовке HTTP-запроса Host.
- X-Перенаправленный Сервер:Имя хоста прокси-сервера.
Будьте осторожны при использовании этих заголовков на исходном сервере, поскольку они будут содержать более одного значения (через запятую), если исходный запрос уже содержал один из этих заголовков.Например, вы можете использовать %{X-Forwarded-For}i в строке формата журнала исходного сервера для регистрации IP-адресов исходных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.
В вашем сервлете вы бы имели:
doGet(HttpServletRequest request, HttpServletResponse response){
request.getHeader("X-Forwarded-For")
}
это очень просто:
<VirtualHost>
ServerName www.server.com
redirect / http://www.server.com/foo
ProxyRequests off
ProxyPass / ajp://localhost:8009/
</VirtualHost>