一 案例描述以及介绍

1.1 案例说明

 1.2 标准的nginx配置文件

server {
    listen       80;
    server_name  192.168.1.2;
    error_log   /usr/local/etc/nginx/logs/test.error.log;
    access_log  /usr/local/etc/nginx/logs/test.access.log;
    location / {
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   Host             $http_host;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        add_header Access-Control-Allow-Origin *;
        proxy_pass  http://127.0.0.1:8889;
    }  
    location /app {
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   Host             $proxy_host;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_pass http://192.168.1.3;
    }
}

1.3 proxy_set_header的作用

首先说明proxy_set_header是用来设置请求头的,设置了请求头后,后端服务器就可以获取到这些变量值。

1.3.1 X-Real-IP

是指获取客户端的真实IP,如果设置了$remote_addr这个值,后端服务器就能获取到客户端的真实IP,也就是此例中的192.168.1.1

1.3.2 host

1.host的值设置为$proxyhost,是指proxy_pass中设置的host值,也就是192.168.1.3,也就是服务器的IP地址。 

2.若客户端发过来的请求header中有HOST这个字段,$http_host和$host表示的就是原始请求host,比如请求的时候HOST的值是http://test.com,那么反向代理后还是http://test.com

3.若客户端发过来的请求header中没有HOST这个字段,$host表示nginx代理服务器的地址,也就是此例中的192.168.1.2。

4.$httphost不是一个固定的变量,它其实是$http_HEADER通配后的结果,例如$http_content_type表示请求头里content-type属性的值,同理,$http_host指的就是请求头里的host属性。

1.3.3 X-Forwarded-For

这个变量的值有$proxy_add_x_forwarded_for和$remote_addr,在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip。

用户A的IP是192.168.1.1,请求一个经过两次nginx转发的应用,在第一台nginx中(192.168.1.2),配置如下:

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

这时: $proxy_add_x_forwarded_for和$remote_addr的值为用户ip:192.168.1.1

到第二台nginx,配置如下:

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址( 192.168.1.2,那么X-Forwarded-For的值就变成了"用户的真实ip,第一台nginx的ip",也就是“192.168.1.1, 192.168.1.2”

1.4 proxy_set_header 的作用

proxy_set_header用来设定被代理服务器接收到的header信息。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐