Nginx在使用varnish作缓存情况下获取用户真实ip(3)

三,配置varnishd,让nginx获取到真实用户的ip.

那么现在我们来整一下varnish的配置。让varnish把$http_real_ip和$http_X_forwarded_for值传给nginx.

 我们在A服务器的varnish配置文件里的sub vcl_recv 里面加入以下这段:

remove req.http.X-real-ip; set req.http.X-real-ip = client.ip; set req.http.X-Forwarded-For = client.ip; 

意思就是获取用户的真实ip 即 client.ip 并赋值给  http.X-real-ip 和 http.X-Forwarded-For。

现在的varnishd配置文件为: 

 

#Cache for linuxtone sites   #backend vhost   backend  wwwlinuxidccom {  .host = "www.linuxidc.com";  .port = "80";  }  #acl   acl purge {    "localhost";    "127.0.0.1";    "192.168.0.0"/24;  }  sub vcl_recv {     #此处为添加内容 remove req.http.X-real-ip;  set req.http.X-real-ip = client.ip;  set req.http.X-Forwarded-For = client.ip;             if (req.http.Accept-Encoding) {              if (req.url ~ "\.(jpg|png|gif|jpeg|flv)$" ) {                  remove req.http.Accept-Encoding;                  remove req.http.Cookie;              } else if (req.http.Accept-Encoding ~ "gzip") {                  set req.http.Accept-Encoding = "gzip";              } else if (req.http.Accept-Encoding ~ "deflate") {  
#以下略。。  

我们再来看一下nginx的访问日志。看有没有获取到用户真实ip.

这下我们获取到了我本机的真实ip。192.168.1.5,但是我们从定义的日志格式来看,这个值应该是 http.X_Forwarded_For 的值。当有多级代理的时候,这个值不能代表用户的真实ip.但是我在varnishd确实把http_real_ip传过来了啊,为什么不能显示呢。这下,我们用要用到nginx的 http_realip_modul这个模块了。接下来,我们在nginx里,做一下设置,来获取 real_ip.

四:修改nginx配置文件,来获取用户真实ip.

  Nginx 的http_realip_modul很好用。在nginx里定义一下从哪获取值。获取哪个值。就OK 了,

我们把虚拟主机的配置文件修改成下面这样的:

server         {                 listen    80;                 server_name ;                 index  index.php index.html index.htm;                 root  /home/yaozhibing; location / {   set_real_ip_from   192.168.1.151;   real_ip_header     X-Real-ip;    log_format  wwwlogs  '$remote_addr - $http_x_real_ip - $http_X_Forwarded_For - $remote_user [$time_local] "$request" ';     access_log  /home/linuxidc.log  wwwlogs; 

也就是在虚拟机主机的配置文件里,添加了:

location / {   set_real_ip_from   192.168.1.151;   real_ip_header     X-Real-ip; 

set_real_ip_from 是定义获取的源,就是从哪里获取值

real_ip_header  是定义获取哪个值。

我们来重启一下nginx,并监控一下日志。

我们看到,http.X_real_ip 和 http.X_Forwarded_For的值。都能正常显示了。

如果不想看到上级代理的值。在nginx配置文件里把 log_format 的 $remote_addr去掉就可以了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c5c72636078c52ff53dbdd4f745dc595.html