通常情况下,我们访问互联网的时候,这个交互过程类似下图所示:
反向代理示意图
这里主要讨论服务器端的情况,在上图中,服务端侧的Server Proxy 就是一个反向代理服务器。
反向代理的好处是:
A. 对internet上的用户来说,屏蔽了后端服务器的真实地址,在一定程度上保证了后端服务器的安全;
B. 通过反向代理,后端可以设置很多的服务器一起提供相同的服务,从而增大后端服务器的业务承载能力;
但事物都是具有两面性的,对于服务器来说,反向代理提供了上述两条好处,同时也带来了如下不方便的地方:
remote_addr就是客户端的真实IP。 如果使用了反向代理,很明显无法通过remote_addr来获得client的真实IP,但是如果我们在client所遇到的第一个反向代理中获取该 remote_addr的值,并保存到某一个变量中,那么后续可以通过访问这个变量来获得真正的client 的IP,这个变量就是 http_x_real_ip, 所以我们获取用户真实IP地址的做法通常是: 在第一个反向代理中配置: proxy_set_header X-Real-IP remote_addr ,在server中使用 http_x_real_ip的方式来引用,从而获得用户的真实IP地址。 至此,我们就解决了: 获取用户真实IP的问题 以及 获取最后一跳的反向代理地址的问题。
http_x_forwarded_for 的第一个值,应该就是client的IP, 因为此时reverse proxy1和client 属于client-server 模式,而reverse proxy1充当了server的角色; 而前面讲了,获取客户端的IP一般是通过 $http_x_real_ip来获取,那是否也可以通过 $http_x_forwarded_for的第一个值来获取呢?一般不建议这样做,因为用户发送请求的时候,可以通过伪造http头,从而使得$http_x_forwarded_for的值不可靠,所以用 $http_x_real_ip来获取更可靠,因为$remote_addr是无法通过构造http的head 来伪造的
作者:My熊猫眼
链接:https://cloud.tencent.com/developer/article/1640245
来源:简书