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()
}
Ответы
Ответ 1
Сделайте это так:
в конфигурации 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 знал, что соединение должно считаться безопасным.
Ответ 2
Вы можете прочитать X-Forwarded-For в заголовке запроса.
Из документации Apache mod_proxy:
При работе в режиме обратного прокси (например, с помощью директивы ProxyPass) mod_proxy_http добавляет несколько заголовков запросов для передачи информации на исходный сервер. Эти заголовки:
- X-Forwarded-For: IP-адрес клиента.
- X-Forwarded-Host. Исходный хост, запрошенный клиентом в заголовке HTTP-запроса хоста.
- X-Forwarded-Server: имя хоста прокси-сервера.
Будьте внимательны при использовании этих заголовков на исходном сервере, так как они будут содержать более одного (разделенные запятыми) значения, если исходный запрос уже содержит один из этих заголовков. Например, вы можете использовать% {X-Forwarded-For} я в строке формата журнала исходного сервера для регистрации IP-адреса первоначальных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.
В вашем сервлете у вас будет:
doGet(HttpServletRequest request, HttpServletResponse response){
request.getHeader("X-Forwarded-For")
}
Ответ 3
это очень просто:
<VirtualHost>
ServerName www.server.com
redirect / http://www.server.com/foo
ProxyRequests off
ProxyPass / ajp://localhost:8009/
</VirtualHost>