首页 > 数据库 > 数据库开发技术 > ?Nginx 中获取客户端 ip 相关的问题
通常情况下讲,我们的客户端可以采用 remote_addr 的 http 头获取客户端的 ip,但是在世实际使用过程中,我们会发现中间通常会有多层级别的代理 ip,因此真正服务端就无法通过该 header 获取真实的客户端 ip 了。
如今,一般中间层代理通常都会使用 Nginx 相关的服务来做 7 层的代理,因此一般会在代理过程中通过一系列的头设置相关的变量,从而将最原始的客户端 ip 透传到最终的服务端。
x_forwarded_for 简称 XFF 头,它代表客户端,也就是 HTTP 的请求端真实的 IP,只有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web 服务器就不知道你的真实 IP 了,为了避免这个情况,代理服务器通常会增加一个叫做 x_forwarded_for 的头信息,把连接它的客户端 IP (即你的上网机器 IP) 加到这个头信息里,这样就能保证网站的 web 服务器能获取到真实 IP
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
X-Forwarded-For 一般是每一个非透明代理转发请求时会将上游服务器的 IP 地址追加到 X-Forwarded-For 的后面,使用英文逗号分割X-Real-IP 一般是最后一级代理将上游 IP 地址添加到该头中X-Forwarded-For 是多个 IP 地址,而 X-Real-IP 是一个
验证相关请求参数
### Nginx Proxy
192.168.107.107 nginx.conf
location /test {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.107.112:8080;
}
192.168.107.112 nginx.conf
location /test {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.107.114:8080;
}
### Nginx Backend
192.168.107.114 nginx.conf
location /test {
default_type text/html;
charset gbk;
echo "$remote_addr ||$http_x_real_ip ||$http_x_forwarded_for";
}
通过上述三层 Nginx 的服务,可以验证 remote_addr http_x_real_ip http_x_forwarded_for 三者之间的区别和联系。
原文作者:云原生运维技术;如有侵权,请联系管理员删除。