2009-07-25 50 views
13

我現在有一個Tomcat + Apache的HTTP服務器設置爲我的的Java servlet:的ProxyPass,ProxyReverse VS AJP

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

這是一切優秀,除了myservice需要知道客戶端的IP地址,它總是證明由於代理服務器而成爲127.0.0.1。有沒有解決方案來獲得真正的IP地址? AJP是一個選項嗎?在Apache的配置

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

回答

19

做這樣的

<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來知道連接應該被認爲是安全的。

+1

我有客戶端的服務器配置否認:代理:AJP://127.0.0.1:8009/tomcat的錯誤在error.log中 我必須將Proxy *設置從Deny all更改爲Deny none /etc/apache2/mods-enabled/proxy.conf 只需在此處提及未來查找。 – KishoreK 2011-07-06 01:25:25

+0

這幫了我很多。我是一個白癡,並把`http`而不是`ajp` ...大聲笑! – cbmeeks 2013-03-27 20:34:07

1

這是非常簡單的:

<VirtualHost> 

ServerName www.server.com 

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

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

</VirtualHost> 
3

您可以在請求頭讀取的X - 轉發,對於。

Apache mod_proxy documentation

當在反向代理模式作用(使用ProxyPass指令,例如),mod_proxy_http爲了將信息傳遞給源服務器增加了幾個請求頭。這些標題是:

  • X - 轉發,對於:客戶端的IP地址。
  • X-Forwarded-Host:客戶端在主機HTTP請求標頭中請求的原始主機。
  • X-Forwarded-Server:代理服務器的主機名。

在原始服務器上使用這些標頭時要小心,因爲如果原始請求已包含這些標頭之一,它們將包含多個(逗號分隔)值。例如,您可以在原始服務器的日誌格式字符串中使用%{X-Forwarded-For} i來記錄原始客戶端的IP地址,但如果請求經過多個代理服務器,您可能會獲得多個地址。

在你的servlet,你會:

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