谈一谈HTTP代理
1. Web的中间实体
Web代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,扮演”中间人”的角色,在各端点之间来回传送HTTP报文。
代理服务器可以是某个客户端专用的,也可以是很多客户端共享的。单个客户端使用的代理被称为私有代理。众多客户端共享的代理被称为公共代理。
代理与网关的对比:严格的说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。
2. 为什么使用代理
代理服务器可以实现各种时髦且有用的功能。它们可以改善安全性,提高性能,节省费用。
儿童过滤器
文档访问控制
可以用代理服务器在大量Web服务器和Web资源之间实现统一的访问控制策略,创建审计跟踪机制
安全防火墙
网络安全工程师通常会使用代理服务器来提高安全性。代理服务器会在网络中的单一安全节点上限值哪些应用层协议的数据可以流入或流出一个组织。还可以提供用来消除病毒的Web和E-mail代理使用的挂钩程序,以便对流量进行详细的检查。
Web缓存
代理缓存维护了常用文档的本地副本,并将它们按需提供,以减少缓慢且昂贵的因特网通信。
反向代理
代理可以假扮Web服务器。这些被称为替换物(surrogate)或反向代理(reverse proxy)的代理接收发送给Web服务器的真实请求,但与Web服务器不同的是,它们可以发起与其他服务器的通信,以便按需定位所请求的内容。
可以用这些反向代理来提高访问慢速Web服务器上公共内容的性能。在这种配置中,通常将这些反向代理称为服务器加速器(server accelerator)。还可以将替换物与内容路由功能配合使用,以创建按需复制内容的分布式网络。
内容路由器
代理服务器可以作为”内容路由器”使用,根据因特网流量状况以及内容类型将请求导向特定的Web服务器。
内容路由器也可以用来实现各种服务级的请求。例如为付费的用户将请求转发到附近的复制缓存,为申请过滤服务的用户使用过滤代理来转发HTTP请求。
转码器
代理服务器在将内容发送给客户端之前,可以修改内容的主题格式。在这些表示法之间进行的透明转换被称为转码(transcoding)
匿名者
匿名者代理会主动从HTTP报文中删除身份特性(比如客户端IP地址,From首部,Referer首部,cookie,URI的会话ID),从而提供高度的私密性和匿名性。
E.g.
从User-Agent首部删除用户的计算机和OS类型
删除From首部以保护用户的E-mail地址
删除Referer首部来掩盖用户访问过的其它站点
删除cookie首部以剔除概要信息和身份的数据
3. 代理会去往何处
3.1 代理服务器的部署
出口代理
可以将代理固定在本地网络的出口点,以便控制本地网络与大型因特网之间的流量。
访问(入口)代理
代理常被放在ISP访问点上,用以处理来自客户的聚合请求。ISP使用缓存代理来存储常用文档的副本,以提高用户的下载速度,降低因特网带宽消耗。
反向代理
反向代理可以处理所有传送给Web服务器的请求,并只在必要时向Web服务器请求资源。反向代理可以提高Web服务器的安全性能,或者将快速的Web服务器缓存放在较慢的服务器之前,以提高性能。反向代理通常会直接冒用Web服务器的名字和IP地址,这样所有的请求就会被发送给代理而不是服务器了。
网络交换代理
可以将具有足够处理能力的代理放在网络之间的因特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监控。
3.2 代理的层次结构
可以通过代理层次结构(proxy hierarchy)将代理级联起来。
代理层次结构可以是静态的,也可以是动态的。代理服务器可以根据众多因素,将报文转发给一个不断变化的代理服务器和原始服务器集。
动态选择父代理的例子:
负载均衡
子代理可能会根据当前父代理上的工作负载级别来决定如何选择一个父代理,以负载均衡
地理位置附近的路由
子代理可能会选择负责原始服务器所在物理区域的父代理
协议/类型路由
子代理可能会根据URI将报文转发到不同的父代理和原始服务器上去。
基于订购的路由
在不同的产品中,动态父代理由逻辑的实现方式各有不同,包括使用配置文件、脚本语言和动态可执行插件等。
3.3 代理如何获取流量
修改客户端
如果将客户端配置为使用代理服务器,客户端就会将HTTP请求有意的直接发送给代理,而不是原始服务器。
修改网络
网络基础设施可以通过若干种技术手段,在客户端不知道或没有参与的情况下,拦截网络流量并将其导入代理。这种代理被称为拦截代理(intercepting).
修改DNS的命名空间
放在Web服务器之前的代理服务器——替换物,会直接假扮Web服务器的名字和IP地址,这样,所有的请求就会发送给这些替换物,而不是服务器了。
修改Web服务器
也可以将某些Web服务器配置为向客户端发送一条HTTP重定向命令(响应码305),将客户端请求重定向到一个代理上去。收到重定向命令后,客户端会与代理进行通信。