• Nginx realip_module

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • Nginx realip_module 模块 = Apache mod_rpaf

    本模块可以修改客户端请求头中的客户端IP地址,例如X-Real-IP和X-Forwarded-For。如果Nginx位于Squid等代理服务器之后,或者位于F5 Big-IP、NetScaler等七层负载均衡交换机之后,本模块将非常有用。
    本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定:
    ./configure --with-http_stub_status_module -with-pcre=../pcre-6.6 --with-http_realip_module
    ./configure --with-http_realip_module
    make
    make install
    假设一台Nginx位于Squid的后端,Squid设置了X-Forwarded-For头信息,记录了用户的真实IP,但是,如果存在多级代理的情况,X-Forwarded-For头信息的内容值将变成以逗号分隔的多个IP地址。
    X-Forwarded-For:202.108.1.1, 192.168.1.5, 192.168.1.6, 192.168.2.1
    通过本模块,你可以设置一个可信的代理服务器IP列表,Header头中第一个不受信任的IP将作为客户端IP。例如以上的X-Forwarded-For信息中,假设202.108.1.1为客户端IP,其他均为代理服务器IP,就可以使用以下配置:
    set_real_ip_from 192.168.1.0/24;
    set_real_ip_from 192.168.2.1;
    real_ip_header X-Forwarded-For;
    这样,X-Forwarded-For中的IP信息就只剩下客户端的IP地址202.108.1.1了。


    Apache 有个第三方开发的 mod_rpaf ,用于当 Apache 置于 proxy 后端的时候接收到前端送来的 IP head
    从而获取到真实的IP. 不然日志跟应用都始终只能获取到 反向代理服务端的IP
    简单说就是,Nginx --> Apache 能获取到用户访问的真实IP .

    但如果反过来,又或者是 Squid --> Nginx 呢?

    有这么 一情况,某网站静态文件很多, 而且用户访问的来源有网通,有电信,有铁通...设置还有国外。
    为了令处于不同网络运营商的用户收取静态文件的速度都有良好的体现,该网站分别在这些不同运营商的积分中部署了Squid,然后统一 Proxy 到主站的 Nginx 上,形成分布式缓存架构。

    如果单是这样的话,主站上 Nginx 的日志,或者应用所获得的IP来源,始终都只会是各个机房中 Squid 的IP。而不是用户的真实IP。Apache 的话,能通过以上所提到的mod_rpaf解决。当然,强大的 Nginx 也有自己的看家法宝。

    Nginx 有个在编译时默认不加载的模块 http_realip_module ,就是用来实现这一功能。
    但 网上很多作者对这一模块的理解完全错误,以为是 Proxy 参数里头的 proxy_set_header 。

    proxy_set_header 用于向后端转发 IP head,这一参数是位于 proxy_module 模块中的,而并非 http_realip_module .
    好多的博主写文章的时候,都把这模块的用途写成了“为后端应用提供 realip ”

    Nginx 官方 wiki 对于该模块的说明http://wiki.nginx.org/NginxHttpRealIpModule
    “It is useful if nginx works behind some proxy of L7 load balanver, and request come from local IP, but proxy add request header with client's IP.

    This module isn't built by default, enable it with the configure option ”

    说 简单了,就是 Nginx 的 http_realip_module = Apache 的 mod_rpaf 用于接受前端发来的 IP head 信息,从获取到真是的用户IP。

    配置方式相当简单,重新编译 Nginx 加上 --with-http_realip_module 参数,如:

    ./configure --with-http_realip_module
    make
    make install
    怎 么?Nginx 的服务正在跑着?要重启不容易?
    简单,原来你的 Nginx 装在哪,重新编译的时候就选哪,直接 make install 进去就会把原来的覆盖掉。
    然后执行 Killall -s USR2 nginx 即可平滑升级。
    编辑 Nginx.conf

    在 location 里头插入
    location /{
    set_real_ip_from 192.168.1.0/24; 指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
    set_real_ip_from 10.1.16.129;
    set_real_ip_from 10.1.16.130;
    set_real_ip_from 10.1.16.7;
    real_ip_header X-Real-IP;
    }
    location ~ \.(jsp|jspx|do)?$ {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_pass http://tomcat_server;
    }
    location ~ (action=)?$ {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_pass http://tomcat_server;
    }
    配置跟 mod_rpaf 大致相同!

    配置完成后 sbin/nginx -t 测试语法
    测 试无误执行 Killall -s HUP nginx 平滑加载配置。
    这么就无间断完成了Nginx这一模块的加载。

    • 标签:
    • realip
    • 用户
    • nginx
    • module
    • ip
    • proxy_set_header
    • 学习元
    • x-forwarded-for
    • proxy
    • apache
    • set_real_ip_from
    • 模块
    • squid
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论
      
暂无内容~~
顶部