• Nginx作为反向代理时传递客户端IP的设置方法


           因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的各种故障

           nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。

    nginx做前端,转发日志到后端nginx服务器

           因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
           同样适用于前端是 Squid 或者其他反向代理的情况。

           首先前端的 Nginx 要做转发客户端 IP 的配置:

    location / {
        proxy_pass http://localhost:8000;
      
        # Forward the user's IP address to Rails
        proxy_set_header X-Real-IP $remote_addr;
        # needed for HTTPS
        # proxy_set_header X_FORWARDED_PROTO https;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

           后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换,可以避免中断服务。

           升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:

    location / {
        proxy_pass http://localhost:8000;
      
        # Forward the user's IP address to Rails
        proxy_set_header X-Real-IP $remote_addr;
        # needed for HTTPS
        # proxy_set_header X_FORWARDED_PROTO https;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        # NginxHttpRealIpModule
        set_real_ip_from 192.168.1.0/24;
        set_real_ip_from 192.168.2.1;
        real_ip_header X-Real-IP;
    }

           最后,执行 nginx -s reload

    nginx做前端,转发日志到后端apache服务器

           apache日志中默认有 %h 来指定来访客户端你的ip地址,但是使用了nginx代理上网则 %h 获得的ip地址会不准。

           这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。

           /usr/nginx/conf/nginx.conf 添加以下参数:

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;

           同时修改虚拟主机的配置文件:

    server {
       listen 80;
       server_name 域名 ;
       proxy_redirect off; 
       location / {
          proxy_set_header  X-Forwarded-For $remote_addr;
          proxy_set_header  X-Forwarded-Host $server_name;
          proxy_set_header Host $host;
          proxy_pass http://域名;
       }
       access_log off;
     }

           最后,重启Nginx服务使之生效。

           Apache 端需要安装一个第三方模块“mod_rpaf”。官方网站:http://stderr.net/apache/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 
    /opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

           修改apache配置 /usr/apache2/conf/httpd.conf

    LoadModule rpaf_module modules/mod_rpaf-2.0.so 
    RPAFenable On 
    RPAFsethostname On 
    RPAFproxy_ips ip地址  #Nginx所在服务器的IP
    RPAFheader X-Forwarded-For

           重启apache 查看日志就可以看见日志中已经获得到真实ip了。

    nginx做前端,转发日志到后端IIS服务器

           iis 如果放在反向代理后面,日志里的ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事

    (1)在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例:

    server
    {
      location
      {
          ……
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          ……
      }
    }

    (2)在iis站点上安装下面这个isapi filter,这东西是在f5的开发论坛上找到的,按开发者的话说,是为了解决iis放在f5后记录不到用户ip的问题,-_-# 管他前端是f5还是nginx还是squid还是haproxy。都可以用。应该不错。装完之后重启下iis就搞定了。

           http://devcentral.f5.com/weblogs/Joe/archive/2009/08/19/x_forwarded_for_log_filter_for_windows_servers.aspx

           回头看下iis的日志,里面的ip已经是用户的真实ip了。

  • 相关阅读:
    error: device not found
    xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Deve
    联想X系列服务器
    华为服务器
    linux db2升级
    aix6.1升级openssh&&openssl
    upgrading mysql: error: 1102: Incorrect database name
    linux7配置yum网络源
    How to install fixpack on DB2
    mysql 表空间管理
  • 原文地址:https://www.cnblogs.com/morgan363/p/12973800.html
Copyright © 2020-2023  润新知