1. 代理服务简介
代理(Proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。
通信双方原本可以直接通信,为什么需要加一层代理?因为代理可以为整个通信带来更多的功能,例如:
- 拦截:代理可以选择性拦截传输的网络流量,比如一些公司限制员工在上班的时候不能访问某些游戏或者电商网站,再比如把我们和世界隔离开来的 GFW,还有在数据中心中拒绝恶意访问的网关
- 统计:既然所有的流量都经过代理,那么代理也可以用来统计网络中的数据信息,比如了解哪些人在访问哪些网站,通信的应答延迟等
- 缓存:如果通信双方比较”远“,访问比较慢,那么代理可以把最近访问的数据缓存在本地,后面的访问不用访问后端来做到加速。CDN 就是这个功能的典型场景
- 分发:如果某个通信方有多个服务器后端,代理可以根据某些规则来选择如何把流量发送给多个服务器,也就是我们常说的负载均衡功能。比如著名的 Nginx 软件
- 跳板:如果 A、B 双方因为某些原因不能直接访问,而代理可以和双方通信,那么通过代理,双方可以绕过原来的限制进行通信。这应该广大中国网民比较熟悉的场景
- 注入:既然代理可以看到流量,那么它也可以修改网络流量,可以自动在收到的流量中添加一些数据,比如有些宽带提供商的弹窗广告
参考文档:
2. 正向代理和反向代理
正向代理和反向代理的不同,关键在于“代理”这个家伙的所有权。假设我要去小明那里拿文件,这时可以有两种情况。正向代理:我委托自己的秘书(代理)去找小明拿文件。反向代理:我去找小明拿文件,小明委托他的秘书(代理)把文件交给我。
同样的,在网络世界中,正向代理就是自己的秘书,自己是隐藏的,不需要亲自出马,秘书帮助自己发送请求获取数据,你要给他开工资(买VPN,做一些设置等)。
反向代理就是服务器的秘书,服务器委托自己的秘书接收请求。秘书拿到请求后交给服务器处理,服务器处理完成后再交给秘书。秘书把拿到的结果返回给用户,并且很得意地告诉用户:我就是服务器。
很多情况下,多个服务器会共用一个秘书(反向代理Nginx),这个秘书同时冒充着很多服务器,一会说我是Tomcat服务器,一会说我是PHP服务器,一会又说我是Django服务器。这个秘书还很机智,有的请求多个Tomcat服务器都能处理,他会送到空闲的那个来处理(负载均衡)。
引用自郝同学自己的回答:反向代理为何叫反向代理?