kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

nignx的proxy_set_header快速理解

https://www.cnblogs.com/eastegg/p/16650586.html

客户端地址(请求服务的地址):192.168.1.1

nignx服务器地址:192.168.1.2

后端服务器地址:192.168.1.3

proxy_set_header设置请求头,以便于后端服务器可以获取以上实际信息。

一、X-Real-IP

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

二、Host

proxy_set_header 可以设置 Host 为 $proxy_host、$host 与 $http_host。

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

$http_host 不是一个固定的变量,他其实是 $http_HEADER 通配后的结果。

$http_HEADER,注意,这里的 HEADER 是一个通配符,通配的是请求头里的 header 属性,例如 $http_content_type 表示请求头里 content-type 属性的值,同理,$http_host 指的就是请求头里的host属性。

$host 是 core 模块内部的一个变量。

当请求头里不存在 Host 属性或者是个空值,$host 则等于 server_name

如果请求头里有Host属性,那么 $host 等于 Host 属性除了端口号的部分,例如 Host 属性是 www.example.com,那么$host就是 www.example.com

变量 是否显示端口 值是否存在
host "Host:value"显示
值为a:b的时候,只显示a
http_host "Host:value",value存在就显示
proxy_host 默认80不显示
其他端口显示
"Host:value"显示

参考:nginx $host$http_host 的区别 - UCloud云社区
https://zhuanlan.zhihu.com/p/115731015
Nginx中$http_host、$host、$proxy_host的区别 - hopeless-dream - 博客园 (cnblogs.com)

三、X-Forwarded-For

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

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

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在 $proxy_add_x_forwarded_for 变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,那么X-Forwarded-For变量的值就是用户的ip:192.168.1.1。

到第二台nginx,配置如下:

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

所以还是建议 X-Forwarded-For 的值设置成 $proxy_add_x_forwarded_for。

参考:https://cloud.tencent.com/developer/article/1899717