本篇文章我们来学习代理。
经过我们前面的内容,比如说用户经过我们的DNS、CDN,还有比如说多地址之类的一些方案,请求到达了我们的系统之上。
用户找到这个系统,其实只是找到了这个系统的一个IP地址,这个系统它不一定是对外提供业务服务的,这么一个系统有可能它只是对外提供一个唯一IP,多个请求到了这个系统之后,还可以把请求分发给不同的小系统,也是做了一次负载均衡。
那么在这个系统做负载均衡的这个方法上,我们会涉及到一个概念,这个概念就叫做代理。在一般的公司中,是通过反向代理这一步来实现的,将对一个IP地址的请求,分发到后面的多台机器上,这个是反向代理。
那么在我们学反向代理之前,我们先来了解一下什么是正向代理。
正向代理
好多人不理解正向代理和反向代理的区别。什么是正向代理呢?
正向代理就是,用户端设置代理服务器,比如说所有的请求都由代理服务器发出,无法判断代理了多少用户端,这叫做正向代理,画一个图,大家就理解了:
比如说这有好多个客户端,每个客户端里都配置了一个代理的网络转发。然后有一个代理服务器,这个请求要去访问,他直接请求代理服务器,然后代理服务器代理他们去请求真正的系统。代理,他们去请求真正的系统OK,这个叫正向代理。正向代理关键点在于无法判断代理多少个用户端,因为每个用户端自己去配置这个代理。
我们要记住,正向代理是用户端配置代理。
反向代理
正向的代理说完之后,我们来看反向的代理。
什么是反向代理
那么反向代理是什么呢?反向代理是服务端配置代理。所有的请求,由服务端接收,然后再由代理服务器分发到后面的服务器。我们来画一个图:
这是一个代理服务器,代理服务器里配置了后面好多个服务器的地址,所有的用户请求,都来请求它,但是代理服务器这边配置了后面好多服务器的地址,然后代理服务器再将这些请求分发到后面的不同的机器上去,这个就叫做反向代理好了。
这样一来,所有的请求呢,都由这么一个服务器来接收,无法判断这台代理服务器代理了多少的后端服务。
我们刚才所说的这种反向代理,它就可以把请求分发到不同的机器上,从而减少每个节点的并发数。而这些节点在外界看来就是一个系统。就是我有好多个节点,只不过前面架了一台代理服务器,请求来的时候,所有的请求都只访问这个服务器,而实际上是请求的后面的多个服务器。对于用户来说,只表现一个IP。
反向代理如何实现
我们来看一下,反向代理是怎么实现。
反向代理的实现手段有很多,根据工作层级的不同,分为两种。一般的我们知道网络有OSI的七层模型,反向代理有四层反向代理或者七层的反向代理,一般是从下往上数就是最高一层是第七层。最低一层物理层,次低一层是数据链路层、网络层、传输层、会话层、表示层,最高一层是应用层。
每一层向相邻的上层提供一个确定的服务,就是你只调我,我实现某一些功能,然后你做一些业务逻辑,你再向上面提供一些确定的功能。
可以看到一下,如果说我们做四层反向代理应该怎么做呢?
四层反向代理
在传输层,我们就只知道传输层是通过IP端口进行传输的。
越靠近用户层知道的信息越多,越靠近下面知道的信息越少,包括最后最下面物理层那知道的肯定就是一些物理的连接,物理的介质。
越往上面知道的信息越多,那么第四层他知道的信息,比如说IP和端口。如果我们要在这一层做代理,我们就是通过IP和端口,你给我一个IP和端口,我们来把你进行转发。
七层反向代理
那如果说要做七层代理呢?七层代理就可以用http,那么在http中就会有URL是吧,就会有各种各样的地址,就会有请求的头,请求的正文等等,进行转发。
也就是说,四层做反向代理的话,掌握的信息更少,实现更简单,但是效率更高,因为它越靠近底层,效率越高。
用七层做反向代理的话,可以做到更智能。七层我可以知道http的各种信息;我可以解析cookie;针对不同的cookie,我们进行不同的转发;我们还可以根据请求资源的类型进行转发,比如说请求图片我给你转发到哪里,请求视频我给你转发到哪里。这样的话功能更丰富,但是效率就会更低一些。因为它越靠近上层,它需要处理的这些逻辑就会越多,它虽然知道的信息更多,但是它的效率也会更低下。
什么叫上游?
实现反向代理,会有一个概念,一个“上游”的概念,什么叫上游?
比如说这是一个代理,代理服务器,我们要代理别人,其实跟我们实际中的做生意的差不多,比如说我代理的一个电脑品牌,那比如说我代理联想,那么联想就是我的上游,别人要找我买电脑,我就去找联想,戴尔,惠普,我代理的这三家。别人找我买电脑,我给你联想,给你惠普,给你戴尔,那么我的上游就是它们三个,它们三个叫上游。
所以说在nginx,比如说做反向代理的负载均衡服务器nginx,nginx里面就会有一个“upstream”的一个概念。我们的nginx配置的时候肯定会配upstream,这里面配置的就是上游的节点,就是后方的这些信息。
还有nginx里面有access_by_lua_file,后面写了一个lua的.lua文件,一个lua规则。你就可以根据lua的规则做反向代理。