简单的说HTTP代理就是处于HTTP客户端和服务器端之间,中转消息的中间人。
一种代理是代客户端去请求服务器,叫做Forward Proxy正向代理;另一种是代理真正的服务器来接收用户请求,叫做Reverse Proxy反向代理。下边分别介绍。
- 先说正向代理,也是最常见的。
为什么需要?客户端不能直接建立连接到目的服务器。比如大公司的内网(或者大T朝内网),你不能直接PING到外网服务器,根本没有路由器帮你传送IP包到外网(或者某部分外网)。这时候又需要允许内网访问网页,比如百度一下什么的。这时候HTTP代理就是不二选择了。HTTP服务器这时候既要接受内网的请求,又要能连接外网。所以这时候HTTP服务器必须位于所谓的DMZ非军事区或者内外两个网卡非别连接内外网。
正向代理要求客户端必须知道代理服务器的地址和端口,并且显式配置。
浏览器或者其它客户端在使用代理的情况下行为与不使用代理有所不同:
1. 所有网页不再连接目标主机,改为建立TCP连接到代理。
2.发送请求时,必须发送完整URL,比如GET http://www.luoxq.com/index.html,而不能再简单发送GET /index.html。因为代理服务器要知道客户端究竟要访问哪个网站。而不用代理的情况下,客户端已经直接连接到www.luoxq.com了,没必要发主机名。(实际上也有必要,但是历史原因一般通过Host头部发送了)。
3.对与HTTPS连接要特别处理。因为HTTPS就是要保证安全,如果代理能从中看到客户端和服务器的通信就不安全了。比如你不希望使用支付宝的时候代理服务器还看到你发送的信息吧:)。那怎么做到呢?代理协议有个特殊的方法,叫CONNECT。这时候客户端发送一个 CONNECT www.luoxq.com:443请求。代理服务器呢,只是简单的帮客户端连接服务器的443端口,并且以二进制的方式(不去解读,也无法解读内容)中转两方的TCP数据流。客户端和服务器会利用这个隧道连接传送数字证书和公钥。利用PKI公钥机制,代理服务器完全无法解读他们的通信。这样就安全了。说道这里,我们可以想象如果客户端并不是请求页面,代理服务器也无法获知客户端与服务器究竟是不是在做HTTP通信。也就是说通过这个隧道实际上可以建立到外网的任意TCP连接。呵呵。
我们可以想想一个代理服务器 的内部逻辑不会太复杂,对头部的一些解读,然后就是中转数据流。当然一个真正的完整的代理服务器有很多功能,比如缓存等。
- 下面说说反向代理。也许只有系统管理员才熟悉这个。
反向代理对客户端不可见。也就是说你访问www.luoxq.com很可能你是在访问一个反向代理,但是你并不知道。其实反向代理也可以说是一个门面服务器。反向代理主要起到以下作用:
1. 集群和负载均衡。一个大网站可以由多台服务器提供服务。这些服务器可以位于不可见的内网。反向代理服务器将多个用户请求分发给多台服务器处理。这里当然有比较复杂的配置,比如分发算法,粘住会话,探测服务器状态等。
2.提供业务服务器业务逻辑之外的功能。比如数字证书,单点登录,日志,更好的静态文件性能等。
Apache HTTPD是最常用的代理服务器之一。它既可以配置为正向代理,还可以配置为反向代理,并且它有丰富的插件支持各种功能,或者只是用它作为应用服务器 – 使用PHP, CGI等。官方文档有很好的说明。也可以同时配置成正向和反向代理,并行不悖,并且可以同时给正向代理配置安全属性 – 如果你需要这个可以给我留言。