深入nginx之《获取用户的真实IP》

获取用户的真实IP

        Nginx会将客户端的IP信息存放在$remote_addr变量里,但这并不意味着它就是客户端的IP,生产环境往往会充满各种代理,让IP的来龙去脉变得扑朔迷离。

        目前互联网公司基本上都采用这种架构方式:

 

 

        用户的请求并不是直接和Nginx交互,而是通过了CDN加速平台。默认情况下,Nginx看到的$remote_addr是CDN的IP,这对日志的记录和分析,还有后端的业务逻辑都可能产生不良的影响,如果需要获取到用户的真实IP呢,这个时候realip模块就起到了作用。

        此模块需要编译时开启:

        --with-http_realip_module

        在Nginx的HTTP块里面配置:

        set_real_ip_from CDN_IP;

        real_ip_header X-Forwarded-For;

        real_ip_recursive on;

   

     set_real_ip_from

        设置哪些IP是可信任的,从这些IP进行获取请求头信息,这些IP就配置为CDN的IP白名单。

 

    real_ip_header

        定义从哪个请求头获取IP信息,其值将用于替换客户端地址。一般都使用X-Forwarded-For。

 

    real_ip_recursive

        如果启用递归搜索,将会对可信任的IP匹配,原始客户端地址将替换为在请求头域中发送的最后一个不可信地址。如果禁用递归搜索,则从白名单中由real_ip_header指令定义的请求头中的最后一个地址替换。

 

        通过此方式就可以获取到CDN传递给Nginx的用户的IP。那么问题来了,$remote_addr被替换成了用户的IP,有些时候我们也希望获取到CDN 的节点IP,这对于排查一些和CDN有关的问题是由帮助的。可以使用$realip_remote_addr,它可以保留原始客户端地址。 (1.9.7版本新增的变量)

 

posted @ 2018-08-07 17:59  dtdxrk  阅读(4543)  评论(0编辑  收藏