1
2
3
4
5
1、反向代理服务器nginx.conf配置
在server后面增加三个参数用与记录IP:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Remote Addr
remote_addr 这个字段不是 http 里面的概念,其实是 tcp 的概念,表示的是当前连接的对端的地址,也就是说:

如果在浏览器和 Nginx 之间不存在其他代理,那么这个字段就是真实的 IP
但是,一旦浏览器和 Nginx 之间存在代理,那么这个字段的值就是最后一个代理的地址
X-Real-IP
正如配置中所示,HTTP 中其实不存在这个 Header,但是在 Nginx 中习惯于用来标识用户的真实地址,至于是否真的是客户端的地址,看前面的 remote_addr 的解释我们就清楚了。

X-Forwarded-For
这个就有意思了,X-Forwarded-For 表示在客户端访问 Nginx 的过程中如果需要经过 HTTP 代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的 IP 地址,这个消息首部成为事实上的标准。怎么说,其实就是一个 HTTP 请求从浏览器发出,每经过一个 HTTP 代理或者负载均衡,都会在这个 Header 里面添加一条记录(当然,这是规定,你不遵守我也没办法),所以对于一个请求来说,X-Forwarded-For Header 的值列表里面的第一个值应该就是客户端的地址,及时经过了 N 多的代理和负载均衡。

但是,这毕竟不是真正的标准,所以我们不能期望 100% 一定有这个,但是根据我的经验,对于一些比较成熟的反向代理软件 例如 Nginx/Squid 都是有的,所以大多数情况下都可以通过这个字段获取到真实值。

X-Forwarded-Host
好吧,这个 Header 是乱入的,它和客户端的 IP 没啥关系,它其实是标识客户端发起请求时的 Host 的地址,我们可以通过这个 Header 来获取客户端是访问的哪个 Host 进来的。