2009-07-25 13 views
13

que actualmente tiene un entorno de servidor Tomcat + Apache HTTP para servir a mi Java servlet:ProxyPass, ProxyReverse vs AJP

ProxyPass /myservice http://localhost:8080/myservice 
ProxyPassRerverse /myservice http://localhost:8080/myservice 

Esto es todo bien, excepto que myservice necesita saber la dirección IP del cliente, que siempre resulta ser 127.0.0.1 debido al proxy. ¿Hay alguna solución para obtener la dirección IP real? ¿Es AJP una opción?

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getRemoteAddr() 
} 

Respuesta

19

hacerlo de esta manera:

en la configuración de Apache:

<Location /foo> 
    ProxyPass ajp://localhost:8009/foo 
    ProxyPassReverse ajp://localhost:8009/foo 
</Location> 

Y luego, en el server.xml:

<Connector port="8009" 
      enableLookups="false" secure="true" URIEncoding="UTF-8" 
      tomcatAuthentication="false" 
      protocol="AJP/1.3" /> 

Eso debe pasar a través de todo. El protocolo AJP pasa la información, pero http: no.

Puede que no desee secure = "true", lo uso porque SSL se maneja en la capa de apache y necesito que tomcat sepa que la conexión debe considerarse segura.

+1

Tengo cliente negada por la configuración del servidor: Proxy: AJP: //127.0.0.1: 8009 error/Tomcat en el error.log Tuve que cambiar la configuración de Proxy * de Denegar todo a Denegar ninguno en /etc/apache2/mods- habilitado /proxy.conf Solo mencionar aquí para futuras búsquedas. – KishoreK

+0

Esto me ayudó mucho. Yo era un idiota y puse 'http' en lugar de' ajp' ... ¡LOL! – cbmeeks

+5

Considere modificar su configuración ProxyPassReverse, ya que esto parece ser un error común de acuerdo con http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html – Jack

1

esto es muy simple:

<VirtualHost> 

ServerName www.server.com 

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

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

</VirtualHost> 
3

Puede leer el X-reenviado-A en el encabezado de la solicitud.

Desde el Apache mod_proxy documentation:

Al actuar en un modo de proxy inverso (usando la directiva ProxyPass, por ejemplo), mod_proxy_http añade varias cabeceras de petición con el fin de pasar información al servidor de origen. Estas cabeceras son:

  • X-reenvía Para: La dirección IP del cliente.
  • X-Forwarded-Host: El host original solicitado por el cliente en el encabezado de solicitud HTTP de host.
  • X-Forwarded-Server: El nombre de host del servidor proxy.

Tenga cuidado al usar estos encabezados en el servidor de origen, ya que contendrán más de un valor (separados por comas) si la solicitud original ya contenía uno de estos encabezados. Por ejemplo, puede usar% {X-Forwarded-For} i en la cadena de formato de registro del servidor de origen para registrar la dirección IP del cliente original, pero puede obtener más de una dirección si la solicitud pasa por varios proxies.

En el servlet, que tendría:

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getHeader("X-Forwarded-For") 
} 
+0

Precaución: 'X-Forwarded_For' vs' X-Forwarded-For' ... Copiar y pegar el código puede ser peligroso :) –

Cuestiones relacionadas