zoukankan      html  css  js  c++  java
  • X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)

    https://help.aliyun.com/knowledge_detail/13051859.html?pos=1

    1、IIS 6 配置方案
    2、IIS 7 配置方案
    3、Apache 配置方案
    4、Nginx 配置方案
    5、Tomcat 配置方案


    4 层负载均衡(TCP 协议)服务可以直接在后端 ECS 上获取来访者真实 IP 地址,无需进行额外的配置,以下介绍的内容均是针对 7 层(HTTP 协议)的负载均衡服务而言。7 层负载均衡系统提供 X-Forwarded-For 的方式获取访问者真实 IP,默认开启,用户无需配置。

    1.png

    以下针对常见的应用服务器配置方案进行介绍:

    IIS 6 配置方案

    通过 IIS 6日志中获取来访者真实IP地址的解决方案,首先需要安装插件 F5XForwardedFor.dll,下载地址

    1、 根据自己的服务器操作系统版本将 x86Release 或者 x64Release 目录下的 F5XForwardedFor.dll 拷贝到某个目录,这里假设为 C:ISAPIFilters,同时确保对IIS进程对该目录有读取权限。

    2、打开 IIS 管理器,找到当前开启的网站,在该网站上右键选择 “属性”,打开属性页。

    3、在属性页切换至“ ISAPI 筛选器”,点击“添加”按钮,出现添加窗口。

    4、在添加窗口:“筛选器名称”填写“F5XForwardedFor”,“可执行文件”填写 F5XForwardedFor.dll 的完整路径,点击确定。

    5、重启 IIS 服务器,等待配置生效。

    IIS 7 配置方案

    1、通过 F5XForwardedFor 模块获取来访者真实IP地址的解决方案,首先需要下载与安装插件 F5XForwardedFor 模块,下载地址

    2、根据自己的服务器操作系统版本将 x86Release 或者 x64Release 目录下的 F5XFFHttpModule.dll 和 F5XFFHttpModule.ini 拷贝到某个目录,这里假设为 C:F5XForwardedFor,确保对IIS 进程对该目录有读取权限。

    3、选择“ IIS 服务器”选项,按图所示选择“模块”功能:

    4、双击“模块”功能,点击“配置本机模块”:

    2.png

    在弹出框中点击“注册”按钮:

    3.png

    5、添加下载的 DLL 文件,如下图:

    7.png

    6、添加完成后,勾选并点击“确定”:

    8.png

    7、把这两个 DLL 在 “ API 和CGI限制 ”进行添加,并改为允许:

    9.png

    10.png

    8、重启IIS服务器,等待配置生效。

    Apache 配置方案

    1、首先,安装 Apache 的一个第三方模块“mod_rpaf”, 官方网站

    wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
    tar zxvf mod_rpaf-0.6.tar.gz
    cd mod_rpaf-0.6
    /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

    2、修改 Apache 配置 /alidata/server/httpd/conf/httpd.conf,在最末尾添加:

    LoadModule rpaf_module modules/mod_rpaf-2.0.so
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips IP地址
    RPAFheader X-Forwarded-For
    

    //RPAFproxy_ips IP地址(这个ip地址不是负载均衡提供的公网IP,具体IP请检查 Apache 日志,通常会有 2 个 都要写上)

    3、 添加完成后重启 Apache

    /alidata/server/httpd/bin/apachectl restart

    4、 具体范例

    LoadModule rpaf_module modules/mod_rpaf-2.0.so
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 10.0.0.65 10.0.0.66
    RPAFheader X-Forwarded-For

    Nginx 配置方案

    1、Nginx 作为负载均衡获取真实 IP 是使用 http_realip_module,默认一键安装包安装的 Nginx 是没有安装这个模块的,需要重新重新编译 Nginx 并加装:
    重新编译 Nginx 增加 --with-http_realip_module

    wget http://soft.phpwind.me/top/nginx-1.0.12.tar.gz
    tar zxvf nginx-1.0.12.tar.gz
    cd nginx-1.0.12
    ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
    make
    make install
    kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
    kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`

    2、修改 nginx.conf

    vi /alidata/server/nginx/conf/nginx.conf

    fastcgi connect_timeout 300;
    fastcgi send_timeout 300;
    fastcgi read_timeout 300;
    fastcgi buffer_size 64k;
    fastcgi buffers 4 64k;
    fastcgi busy_buffers_size 128k;
    fastcgi temp_file_write_size 128k;
    

    下面增加
     

    set_real_ip_from ip地址;(这个ip地址首先不是负载均衡提供的公网ip,具体ip多少可以看一下之前nginx日志,如果有多个都要写上。)
    set_real_ip_from ip地址;(这个ip地址首先不是负载均衡提供的公网ip,具体ip多少可以看一下之前nginx日志,如果有多个都要写上。)
    real_ip_header X-Forwarded-For;

    3、重启 Nginx

    /alidata/server/nginx/sbin/nginx -s reload

    Tomcat 配置方案

     Tomcat 的配置方法参考如下步骤。

    1、修改 Tomcat 的 server.xml 配置文件

    vim server.xml

    在配置文件的最下边,找到如下配置

    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t "%r" %s %b" />

    4.png

    修改成以下内容:

    prefix="localhost_access_log" suffix=".txt"
    pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />

    就是把默认配置文件中的 pattern 这行中,添加了 %{X-Forwarded-For}i 。

    5.png

    2、修改完配置文件后,重新启动一下 Tomcat,然后查看 Tomcat 的访问日志,可以看到日志中已经正常记录用户的真实访问 IP 地址。

    tail  localhost_access_log.2015-xx-xx.txt

    6.png

    3、如下是 Java 代码获取 X-Forwarded-For 的示例代码

    /** 
    * 获取ip地址,防止集群、代理
    * @param request 
    * @return ip
    */ 
    
    public static String getAddr(HttpServletRequest request) {  
        String ip = request.getHeader("x-forwarded-for");      
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
    
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
    
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }  
    
        return ip;  
    }
  • 相关阅读:
    MySQL数据库 : 高级查询
    ElasticSearch : High Rest Api 使用
    Java : JavaWeb和Tomcat相关
    Linux : Ubuntu 安装 RabbitMQ
    Spring : Spring Security
    Java : logback简单配置
    Spring : JPA的单独使用
    Java : Netty 入门案例
    python__PIP : 安装第三方库
    好文章收藏(持续更新)
  • 原文地址:https://www.cnblogs.com/waw/p/5488827.html
Copyright © 2011-2022 走看看