ProxyPass、Proxy Reverse 或 AJP

Posted

技术标签:

【中文标题】ProxyPass、Proxy Reverse 或 AJP【英文标题】:ProxyPass, ProxyReverse vs 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()

【问题讨论】:

【参考方案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-proxypas-s-reverse.html,这似乎是一个常见错误 @Jack:你链接的文章很有用,但是地址坏了。 humboldt.co.uk/the-mystery-of-proxypas-s-reverse 似乎有效。 伙计,你成就了我的一天!您的回复帮助了我两次。你是个天才。我可能会问,您是如何获得该领域的专业知识的?【参考方案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-Fori 来记录原始客户端 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>

【讨论】:

以上是关于ProxyPass、Proxy Reverse 或 AJP的主要内容,如果未能解决你的问题,请参考以下文章

Nginx代理proxy pass配置去除前缀

Nginx proxy pass简单用法、负载均衡

Nginx配置proxy_pass末尾有参数与无参数的区别

使用多个 ProxyPass 配置 Apache

具有多个位置的 nginx proxypass

如何设置 Apache ProxyPass 以保留 Express 路由