什么是代理
A同学在Ai大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,这就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
正向代理
我们常用的VPN,一般为正向代理。
正向代理特点为隐藏真实的客户端,服务端不知道请求的客户端是谁,客户端请求的服务都是代理服务器代替请求。
举个例子,国内的用户想要访问 Google 时,会被阻挡。 于是我们可以在国外搭建一台代理服务器(可以访问 Google 的服务器),让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
当出现多个客户端时,是这样的:
Nginx正向代理配置
通过proxy_pass配置代理地址http://google.com。当我们请求www.example.com将会被转发至http://google.com。
server {
server_name www.example.com;
listen 80;
location / {
proxy_pass http://google.com; #设定代理服务器的协议和地址
proxy_set_header HOST $host;
}
}
小结
正向代理代理的对象是客户端,正向代理真正服务的是客户端。不论是一对一,还是多对一,客户端与服务端请求的过程始终隐藏了客户端IP,服务端不清楚客户端是谁。
以客户端的角度来看它有以下优点:
-
可以突破访问限制,由此我们可以访问外网,如:YouTube、Google。它是由客户端控制的代理(想开就开、不想开就不开),做到科学上网
-
正向代理可以隐藏自己的真实IP,只有代理服务器才能知道客户端的IP
-
提高访问速度,代理服务器可以缓存资源,当多个用户访问同一资源时,代理服务器直接把缓存的资源返回,没有必要向目标服务器重复请求同一份资源
反向代理
很久以前,老王去饭店吃饭,需要先到饭店,七荤八素点好菜,坐等饭菜上桌,然后大快朵颐,不亦乐乎。
有了第三方订餐外卖平台(代理),老王懒得动身前往饭店,老王打个电话或用APP,先选好某个饭店,再点好菜,外卖小哥会送上门来。
由于某个品牌的饭店口碑特别好,食客络绎不绝涌入,第三方订餐电话也不绝于耳,但是限于饭店接待能力有限,无法提供及时服务,很多食客等得不耐烦了,纷纷铩羽而归,饭店老总看着煮熟的鸭子飞走了,心疼不已。
痛定思痛,老总又成立了几个连锁饭店,形成一个集群,对外提供统一标准的菜品服务,电话订餐电话400-xxx-7777,当食客涌入饭店总台,总台将食客用大巴运到各个连锁店,这样食客既不需要排队,各连锁店都能高速运转起来,一举两得,老总乐开了花,并为此种运作模式,起名为"反向代理"。
在互联网中,单个服务器处理客户端请求能力有限,当客户端发送的请求过多,会造成服务器忙不过来。这时,我们可以设置多个服务器来共同分担请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到差别。我们只需要知道反向代理服务器是谁就好了。如:www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡
当出现多个客户端(多对多)时,是这样的:
Nginx反向代理配置
不考虑复杂的配置,仅仅是完成一个 http 反向代理
nginx.conf配置文件如下:
conf/nginx.conf
是 nginx 的默认配置文件。你也可以使用 nginx -c 指定你的配置件
//省略
http {
#连接超时时间
keepalive_timeout 120;
tcp_nodelay on;
#设定实际的服务器列表
upstream my_server{
server 127.0.0.1:8089;
}
#HTTP服务器
server {
#监听80端口,80端口是知名端口号,用于HTTP协议
listen 80;
#定义使用www.xx.com访问
server_name www.baidu.com;
#编码格式
charset utf-8;
#反向代理的路径(和upstream绑定),location 后面设置映射的路径
location / {
proxy_pass http://my_server;
}
//省略
}
}
上述例子中,代理仅指向一个服务器。然而,网站在实际运营过程中,多数是以集群的方式运行,这时需要使用负载均衡来分流。
//省略
http {
keepalive_timeout 120;
tcp_nodelay on;
#设定实际的服务器列表
upstream my_server{
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.1.11:80 weight=5;
server 192.168.1.12:80 weight=1;
server 192.168.1.13:80 weight=6;
}
server {
listen 80;
server_name www.baidu.com;
charset utf-8;
location / {
proxy_pass http://my_server;
}
//省略
}
}
Nginx提供了多种负载均衡策略,这里不再过多描述。
小结
反向代理代理的对象是服务端,反向代理真正服务的是服务端。不论是一对多,还是多对多,客户端与服务端请求的过程始终隐藏了服务端IP,客户端不清楚服务端是谁。
以服务端的角度来看它有以下优点:
-
隐藏服务端IP
-
负载均衡,反向代理服务器可以根据负载情况,将请求分发到不同的真实服务器上
-
安全防护,反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为的防护
总结
反向代理与正向代理区别:
-
正向代理和反向代理面向的服务群体不同,正向代理代理的对象是客户端,反向代理代理的是服务端
-
正向代理和反向代理中各自的“视野”不同,正向代理下服务端不知道客户端真实IP,反向代理下客户端不清楚服务端真实IP。
参考资料
https://github.com/dunwu/nginx-tutorial
https://zhuanlan.zhihu.com/p/500768064
https://zhuanlan.zhihu.com/p/25707362