负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作

Posted

技术标签:

【中文标题】负载均衡器 $_SERVER[\'REMOTE_ADDR\'] 不工作【英文标题】:Load Balancer $_SERVER['REMOTE_ADDR'] Not working负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作 【发布时间】:2016-07-23 05:55:36 【问题描述】:

我已切换到使用 Amazon AWS Elastic Load Balancer,现在我获得了 $_SERVER['REMOTE_ADDR'] 的私有 IP 地址 - 用于给我客户端的 IP 地址。

我现在如何获取客户端 IP 地址?

【问题讨论】:

如果负载均衡器没有设置带有客户端 IP 地址的标头,那么您将无法获取客户端的 IP 地址。您可能会查看$_SERVER 超全局并查看是否有这样的标题(例如称为HTTP_X_FORWARDED_FOR)。 docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/… Apache、nginx 还是其他?每个都有一种获取 X-Forwarded-For 地址并使用它的方法。 @CharlotteDunois 所以我可以使用 $_SERVER['HTTP_X_FORWARDED_FOR'];? :) 夏洛特说得对。你应该把它写成答案。 【参考方案1】:

您的网络服务器接收来自 Amazon ELB 的 HTTP 请求。因此,远程地址将始终是 ELB ip 地址之一。 如果您需要 ELB 后面的远程主机地址,请从 HTTP 标头“X-Forwarded-For”获取。

【讨论】:

X-Forwarded-For 正在返回:“192.155.96.40, 54.240.144.13” - 知道为什么它返回两个地址以及它们是什么吗? 是的,您可能需要第一个地址。 ELB 可以返回多个地址,如 docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/… 中所述:如果请求通过多个代理,则 X-Forwarded-For 请求标头中的 clientIPAddress 后面是请求在其之前通过的每个连续代理的 IP 地址到达您的负载均衡器。因此,最右边的 IP 地址是最近代理的 IP 地址,最左边的 IP 地址是原始客户端的 IP 地址。 嗯,没错,但我想我只会相信最右边的那个。我真的不相信来自客户端的任何东西...... 更正 - 右边的仍然是亚马逊 IP - 所以是的,我认为是最左边的 :)【参考方案2】:

以下内容适用于我在 httpd.conf 定义 LogFormat 的全局部分。通过以下更改,$_SERVER['REMOTE_ADDR'] 将设置为 php-fpm 上的客户端 ip,而不是 ELB ip。

<IfModule remoteip_module>
   RemoteIPHeader X-Forwarded-For
   LogFormat "%a %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
   LogFormat "%a %l %u %t \"%r\" %>s %b" common
</IfModule>

解决方案来自https://medium.com/@jiraknet/apache-2-4-mod-remoteip-for-get-real-ip-on-aws-elb-6e9f40876b06

【讨论】:

这实际上是一个很好且简单的解决方案,如果您愿意,可以将其称为“hack”,但简单干净,唯一的缺点是您丢失了转发请求的代理 ip,如果您不是使用它你绝对可以使用这个解决方案

以上是关于负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作的主要内容,如果未能解决你的问题,请参考以下文章

nginx给consul集群配置负载均衡

varnish 的安装,配置及负载均衡

nginx 负载均衡配置及解释说明

nginx负载均衡配置https

eureka server负载均衡怎么实现

Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器