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()
}

person user121196    schedule 25.07.2009    source источник


Ответы (3)


Сделай это так:

в конфиге апача:

<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 знал, что соединение следует считать безопасным.

person caskey    schedule 25.07.2009
comment
У меня есть клиент, отклоненный конфигурацией сервера: ошибка proxy:ajp://127.0.0.1:8009/tomcat в error.log. Мне пришлось изменить параметр Proxy * с Deny all на Deny none в /etc/apache2/mods- enabled/proxy.conf Просто упоминание здесь для будущих поисков. - person KishoreK; 06.07.2011
comment
Это мне очень помогло. Я был идиотом и поставил http вместо ajp... LOL! - person cbmeeks; 28.03.2013
comment
Пожалуйста, рассмотрите возможность изменения настройки ProxyPassReverse, так как это кажется распространенной ошибкой в ​​соответствии с humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html - person Jack; 15.04.2013
comment
@Jack: Ваша связанная статья полезна, но адрес не работает. humboldt.co.uk/the-mystery-of-proxypassreverse кажется, работает. - person beldaz; 26.09.2014
comment
Мужик, ты сделал мой день! Ваш ответ помог мне дважды. Ты гений. Как вы приобрели опыт в этой области, я могу спросить? - person Mohamed Ennahdi El Idrissi; 17.03.2015
comment
Можно ли получить заголовки, такие как X-FORWARDED-FOR или X-FORWARDED-HOST? - person Mohamed Ennahdi El Idrissi; 17.03.2015

Вы можете прочитать X-Forwarded-For в заголовке запроса.

Из документации Apache mod_proxy:

При работе в режиме обратного прокси (например, с использованием директивы ProxyPass) mod_proxy_http добавляет несколько заголовков запроса для передачи информации на исходный сервер. Эти заголовки:

  • X-Forwarded-For: IP-адрес клиента.
  • X-Forwarded-Host: исходный хост, запрошенный клиентом в заголовке HTTP-запроса Host.
  • X-Forwarded-Server: имя хоста прокси-сервера.

Будьте осторожны при использовании этих заголовков на исходном сервере, поскольку они будут содержать более одного значения (разделенного запятыми), если исходный запрос уже содержал один из этих заголовков. Например, вы можете использовать %{X-Forwarded-For}i в строке формата журнала исходного сервера для регистрации исходного IP-адреса клиента, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.

В вашем сервлете у вас будет:

doGet(HttpServletRequest request, HttpServletResponse response){
  request.getHeader("X-Forwarded-For")
}
person rocketscientist    schedule 02.12.2012
comment
Осторожно: X-Forwarded_For против X-Forwarded-For... Копирование кода может быть опасным :) - person Laurent Grégoire; 23.01.2013

это очень просто:

<VirtualHost> 

 ServerName www.server.com

 redirect / http://www.server.com/foo

 ProxyRequests off
 ProxyPass / ajp://localhost:8009/

</VirtualHost>
person alparslan    schedule 13.12.2010