三,配置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去掉就可以了。