【问题标题】:ProxyPass, ProxyReverse vs AJPProxyPass、Proxy Reverse 或 AJP
【发布时间】:2010-11-13 22:29:35
【问题描述】:

我目前有一个 Tomcat + Apache HTTP 服务器设置来服务我的 Java servlet:

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 tomcat ajp proxypass


    【解决方案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 知道连接应该被认为是安全的。

    【讨论】:

    • 我的客户端被服务器配置拒绝:proxy:ajp://127.0.0.1:8009/tomcat 在error.log 中出现错误我不得不将代理 * 设置从拒绝全部更改为拒绝无在 /etc/apache2/mods-enabled/proxy.conf 只是在这里提到以供将来查找。
    • 这对我帮助很大。我是个白痴,把http 换成了ajp...哈哈!
    • 请考虑修改您的 ProxyPassReverse 设置,因为根据humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html,这似乎是一个常见错误
    • @Jack:你链接的文章很有用,但是地址坏了。 humboldt.co.uk/the-mystery-of-proxypassreverse 似乎有效。
    • 伙计,你成就了我的一天!您的回复帮助了我两次。你是个天才。我可能会问,您是如何获得该领域的专业知识的?
    【解决方案2】:

    您可以在请求标头中读取 X-Forwarded-For。

    来自Apache mod_proxy documentation

    在反向代理模式下(例如,使用 ProxyPass 指令),mod_proxy_http 添加多个请求标头,以便将信息传递到源服务器。这些标题是:

    • X-Forwarded-For:客户端的 IP 地址。
    • X-Forwarded-Host:Host HTTP 请求头中客户端请求的原始主机。
    • X-Forwarded-Server:代理服务器的主机名。

    在源服务器上使用这些标头时要小心,因为如果原始请求已经包含这些标头之一,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i 来记录原始客户端 IP 地址,但如果请求经过多个代理,您可能会得到多个地址。

    在您的 servlet 中,您将拥有:

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

    【讨论】:

    • 注意:X-Forwarded_ForX-Forwarded-For... 复制粘贴代码可能很危险 :)
    【解决方案3】:

    这很简单:

    <VirtualHost> 
    
     ServerName www.server.com
    
     redirect / http://www.server.com/foo
    
     ProxyRequests off
     ProxyPass / ajp://localhost:8009/
    
    </VirtualHost>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 2018-05-13
      • 2013-04-16
      • 1970-01-01
      • 2022-12-14
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多