标题:AWS Load Balance: 获取真实客户端IP 出处:Felix021 时间:Sat, 27 Jan 2018 01:04:26 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?2177 内容: AWS的http/https负载均衡挺好用的,但是有一点比较麻烦,因为是应用层协议,所以在后端的nginx(以及下面挂的php-fpm)看到的 REMOTE_ADDR是负载均衡的IP,而直连LB的IP,则是保存在了 HTTP_X_FORWARD_FOR 这个header里面。 当然,在应用里面增加一小段代码去解析这个header也不是什么难事,但是毕竟有些框架已经有一套解析的方案了,而且碰到客户端自己还用代理的时候,这个字段的value是一串IP列表(直连负载均衡的ip是最后一个),就变得更复杂了。比如: $ curl https://test.com/ -H "X-FORWARDED-FOR: 8.8.8.8" php记录下来的 $_SERVER 变量就长这样了: array ( 'HTTP_X_FORWARDED_PORT' => '443', 'HTTP_X_FORWARDED_PROTO' => 'https', 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, 13.31.11.23', 'SERVER_PORT' => '80', 'SERVER_ADDR' => '172.24.22.33', 'REMOTE_PORT' => '56247', 'REMOTE_ADDR' => '172.24.22.34', ) 还是有点头疼的。幸好nginx有提供一个 ngx_http_realip_module 模块,可以解决这个问题,只要在配置里加上这么两行: set_real_ip_from 172.24.0.0/16; #注:这个ip端是负载均衡所处VPC的CIDR real_ip_header X-Forwarded-For; 重启nginx以后,再次访问就可以看到,REMOTE_ADDR 变成了 HTTP_X_FORWARDED_FOR 的 IP列表里最后一个IP。 Generated by Bo-blog 2.1.0