Nginx 多级代理环境下直接获取真实客户的IP地址

前阵子因为需求在集群web中为使用者开辟一个自定义变量为客户的真实IP地址.一般Nginx 直接使用X-Forwarded-For 即可获取到真实访问者的IP.

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

这个X-Forwarded-For会叠加之前分节点IP,若要获取到单纯的访问者IP还需要手动处理比较麻烦.这里有另外一个思路,使用自定义变量传递真实访问者的IP.

在Nginx集群中配置自定义变量True-ip

proxy_set_header   Ture-ip    $ture-ip;           

proxy_set_header   Ture-ip    $remote_addr;

重启集群nginx后,源站日志中测试直接调用$true-ip 即是来访者的真正IP.

这里遇到的问题有:
    1. proxy_set_header   Ture-ip    $ture-ip; 这个变量赋值时第二个字段不可以使用_

    2.遵照这个配置顺序是nginx[源站]最终接受变量的真实IP

    3.如果后端是第三方程序分析[如:java php lu ruby等]接受需要把这个赋值顺序颠倒即:

       proxy_set_header   Ture-ip    $remote_addr;

       proxy_set_header   Ture-ip    $ture_ip;  

nginx为源站测试直接访问/一级中转访问/二级中转访问皆是用户的真实IP

  #一级二级中转为squid时最终变量无效

  #一级squid二级nginx变量仍会获得真实IP

  #squid暂时未测得有效变量request_header_add Ture-ip "%>a" all

log_format testlog'$http_ture_ip - - $time_iso8601 "$request_method$scheme://$host$request_uri $server_protocol" $status $bytes_sent"$http_referer" "$http_user_agent"$upstream_cache_status:TCP $request_length $request_time$upstream_response_time $server_addr';

参考          

$http_x_real_ip


   

猜你喜欢

转载自blog.csdn.net/u010842538/article/details/80343677