一、场景
为了防止暴露源IP,以及一些性能的优化,现在越来月多的站长,都会选择用CDN。
CDN或者SLB之后的nginx,如果用传统的remote_addr拿到的IP,通常都是CDN节点IP或者是SLB的节点IP。
这就导致我们网站的access log,denyhosts log等一些软件不能正常工作,诗人此文的目的,便是在于拿到client端的real ip。
通常这些CDN供应商都会传递X-FORWARD-FOR。
诗人博客此文以cloudflare为例。
二、方法一:通过HTTP_X_FORWARDED_FOR获取IP地址
生产环境中,最终的web服务器之前可能还会有NGINX代理服务器,一般的架构如下:最终用户client==>CDN==>NGINX代理==>NGINX 网站 。
1 2 3 4 | <?php $ip = getenv("HTTP_X_FORWARDED_FOR"); echo "HTTP_X_FORWARDED_FOR 的IP是:".$ip; ?> |
执行以上代码,获得的HTTP_X_FORWARDED_FOR可能是:ip1 ip2 ip3 ip4,这是一行ip地址串,最终的NGINX网站服务器将获取HTTP_X_FORWARDED_FOR头,并截取字符串中第一个不为unkown的IP作为用户真实IP地址。
三、方法二(推荐):通过NGINX 的http_realip_module模块
前提条件:nginx必须安装http_realip_module 这个模块。
诗人博客本文以CloudFlare为例。
在nginx的vhosts下,某个网站的 conf 文件的合适位置,插入如下代码,代码中的set_real_ip_from地址,都是cloudflare官方提供,参考此文:https://www.bluenoob.com/virtualization/public-cloud/cloudflare/cloudflare-cdn-real-ip-ranges.html
vhost的conf文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Real IP CloudFlare # https://www.cloudflare.com/ips-v4 set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/12; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; real_ip_header X-Forwarded-For; real_ip_recursive on; |
四、方法二测试方法
通过注释上面conf配置文件启用或者禁用来进行测试。
测试所用PHP代码如下:
1 2 3 4 | <?php $ip = $_SERVER['REMOTE_ADDR']; echo "http_realip_module的IP:".$ip; ?> |
会员登录关闭
注册会员关闭