代理服务
Last updated
Last updated
HTTP 代理就是客户端和服务器通信链路中的一个中间环节,为两端提供代理服务。
客户端,client
代理服务器,proxy server
源服务器,origin server
所谓的代理服务,是指服务本身不生产内容,而是处于中间位置转发上下游的请求和响应,具有双重身份。面向下游的用户时,表现为服务器,代表源服务器响应客户端的请求;面向上游的源服务器时,又表现为客户端,代表客户端发送请求。
为了让 intermediate(中间)HTTP 节点(proxy servers, web cache 等)完成其功能,一些 HTTP header 是 hop-by-hop(逐跳)管理的,而其它是 end-to-end(端到端,即 source client 和 target web server)管理的。
正向代理:靠近客户端,代表客户端向服务器发送请求
反向代理:靠近服务器端,代表服务器响应客户端的请求
匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器
透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端
有这样一句至理名言:“计算机科学领域里的任何问题,都可以通过引入一个中间层来解决”。在这句话后面,还可以再加一句“如果一个中间层解决不了问题,那就再加一个中间层”。TCP/IP 协议栈是这样,代理亦是如此。
代理处于中间层,为 HTTP 处理增加了更多的灵活性,可以实现以下功能:
代理最基本的一个功能是负载均衡。因为在面向客户端时屏蔽了源服务器,客户端看到的只是代理服务器,源服务器究竟有多少台、是哪些 IP 地址都不知道。于是代理服务器就可以掌握请求分发的大权,决定由后面的哪台服务器来响应请求。代理中常用的负载均衡算法(比如轮询、一致性哈希等)的目标都是尽量把外部的流量合理地分散到多台源服务器,提高系统的整体资源利用率和性能。
在负载均衡的同时,代理服务还执行更多的功能。比如:
健康检查:使用“心跳”等机制监控后端服务器,发现有故障就及时“踢出”集群,保证服务高可用
安全防护:保护被代理的后端服务器,限制 IP 地址或流量,抵御网络攻击和过载
加密卸载:对外网使用 SSL/TLS 加密通信认证,而在安全的内网不加密,消除加解密成本
数据过滤:拦截上下行的数据,任意指定策略修改请求或者响应
内容缓存:暂存、复用服务器响应
由于代理服务器隐藏了真实客户端和服务器,所以如果双方想要获得这些丢失的原始信息,可以使用以下头字段。
Via
追加的是代理的主机名或域名 可判断客户端和源服务器之间是否存在代理
X-Forwarded-For
追加的是客户端的真实 IP 地址(访问控制/用户画像/统计分析) 服务器的 IP 地址通常都是保密的
X-Real-IP
记录客户端 IP 地址,没有中间的代理信息 相当于 X-Forwarded-For 的简化版
X-Forwarded-Host X-Forwarded-Proto
只记录客户端的信息,分别是: 客户端请求的原始域名、原始协议名
有了以上头字段,源服务器就可以拿到准确的客户端信息了。
但对于代理服务器来说,这并不是一个最佳的解决方案(为了追加字段每次还得解析 header),所以就出现了一个专门的代理协议,它由知名的代理软件 HAProxy 所定义,也是一个事实标准,被广泛采用(注意并不是 RFC)。
专门的代理协议,可以在不改动原始报文的情况下传递客户端的真实 IP。
代理协议有 v1 和 v2 两个版本,v1 和 HTTP 差不多,是明文,而 v2 是二进制格式。
v1 版本是在 HTTP 报文前增加了一行 ASCII 码文本,相当于又多了一个头。
服务器看到这样的报文,只要解析第一行就可以拿到客户端地址,不需要再去理会后面的 HTTP 数据,省了很多事情。
不过代理协议并不支持 X-Forwarded-For 的链式地址形式,所以拿到客户端地址后再如何处理就需要代理服务器与后端自行约定。