假设公司网站架构为 client ---->nginx 负载均衡--->varnish 缓存---->nginx( web)----->tomcat 请问如何从 nginx(web)这一层的访问日志日志中获取以下信息:请求发起的客户端 IP 以及经过的 nginx 负载均衡和 varnish 缓存的服务器 IP,看以下架构图: [img]http://dl2.iteye.com/upload/attachment/0110/6899/82291637-d8d8-364e-9208-c09211b45ebe.jpg[/img] 在nginx-web服务器安装nginx的时候需要把 --with-http_realip_module 该模块编译进去,该模块是用来从前端服务器发来的头部信息中,获取到客户端的真实IP地址 nginx负载均衡器上的nginx.conf配置如下(针对本次实验的配置): upstream varnish { server 10.10.10.122; } server { listen 80; server_name localhost; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://varnish; } } varnish-缓存服务器上 test.vcl的配置如下: backend web1 { .host = "10.10.10.123"; .port = "80"; } sub vcl_recv { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + server.ip; } sub vcl_fetch { if(req.request == "GET" && req.url ~ "/"){ set beresp.ttl = 5s; } } sub vcl_deliver { if (obj.hits >0){ set resp.http.X-cache = "HIT"; } else { set resp.http.X-cache = "MISS"; } return(deliver); } nginx-web上nginx.conf的配置如下: 日志格式 nginx自带的日志格式,并未修改 http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ... server { listen 80; server_name localhost; location / { root html; index index.html index.htm; set_real_ip_from 10.10.10.122; real_ip_header X-Real-IP; } 增加这2行配置 set_real_ip_from 10.10.10.122; 告诉nginx从那边获取RealIP的值 real_ip_header X-Real-IP; 存储RealIP值的变量名称 从用户端 10.10.10.46 访问 http://10.10.10.120 [img]http://dl2.iteye.com/upload/attachment/0110/6901/9489650b-a684-3837-b7d1-ac0df6776a02.png[/img] 然后在nginx-web上看日志输出 [img]http://dl2.iteye.com/upload/attachment/0110/6903/edce84b0-d876-35f5-bbbb-8c3b5fd79767.png[/img] 可以看到第一段就是 客户端的IP地址,而并不是varnish服务器的地址,而最后一段里面,就包含 varnish服务器的地址 10.10.10.122 和 nginx服务器的地址10.10.10.120