nginx获取客户端真实IP地址

假设公司网站架构为 client ---->nginx 负载均衡--->varnish 缓存---->nginx( web)----->tomcat 请问如何从 nginx(web)这一层的访问日志日志中获取以下信息:请求发起的客户端 IP 以及经过的 nginx 负载均衡和 varnish 缓存的服务器 IP,看以下架构图:

564ad1a4-a17d-4a40-8ddb-488184b9e3c3.jpg

在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

eb61be7e-d35f-4f89-9a99-b17816dd5bd4.png

然后在nginx-web上看日志输出

c79cd1ff-067d-4ed1-a470-c44e3e4fe82c.png

可以看到第一段就是 客户端的IP地址,而并不是varnish服务器的地址,而最后一段里面,就包含 varnish服务器的地址 10.10.10.122 和 nginx服务器的地址10.10.10.120

标签:nginx, varnish, realip, 真实ip, nginx 获取真实ip

已有 2 条评论

  1. chris chris

    请教一个问题, haproxy 代理, ssl解密在后端(nginx), 导致获取真实性用户的ip为haproxy地址, 如果坚持解密在后端,是不是无法获取用户真实ip。

    1. 很抱歉,这种情况没有实验过,按道理来讲应该是可以的。

添加新评论