nginx负载均衡的实现(正向代理与反向代理)
我们提到nginx会想到两个方面的应用,一是作为Web服务器,二是负载均衡服务器。本文介绍基于nginx的负载均衡的工程实践。
了解代理:
我们从遇到问题,找寻答案的思路来解释这个事情。在用户流量小、业务逻辑简单的情况下,我们可以想象,客户端(n) - 服务器(1)的架构可以完成场景所需的基本要求。但是随着用户量的提升,逻辑日趋复杂,我们可以试想,单服务器的性能问题和单点故障问题,可能直接造成系统的崩溃。那么我们会想到这样一种解决思路,我们用多台服务器(比如说3台),这三台服务器上跑同样的服务,我们只要能够做到,依据不同服务器的状态,向更加理想的服务器发送用户请求,岂不是可以解决性能问题;当这三台服务器跑着同样的服务,即便其中一台出现了故障,对于用户的请求,我们仍然可以通过幸存的服务器进行处理。
分布式服务器.png
如上图所示,nginx就是图中问号的位置。它可以做两个事情,一是替我们的后端服务器接受用户请求;二是接收到请求后,判断将该请求交由哪个服务器进行处理。前者就是nginx的反向代理,而后者则是负载均衡。
啥是反向代理
有反向必然有正向,正向代理是我们最常见的一种方式,比如说FQ。我们打开浏览器想登录google,因为众所周知的原因无法访问,我们会找一个既可以被我们访问,同时也可以访问google的第三方服务器进行中转。这个server就是正向代理服务器。从这样一个场景中我们可以看出正向代理的特点:
- 客户端非常明确我们要访问的服务器地址:www.google.com,
- 代理客户端,服务器只清楚请求来自于哪个代理服务器,而不清楚源头来自哪个客户端,所以说正向代理屏蔽了真实客户的信息。
正向代理.png
反向代理的场景更多用户,服务器集群分布式部署的情况,跟我们文初介绍的场景一样,大白话说,就是用户不需要知道某一个服务器的具体地址,我只要通过访问代理服务器,由代理服务器按照某一原则找到对应的业务服务器即可,由此可以分析出反向代理的特点:
-
代理服务端,客户端只知道代理服务器的地址,但不清楚真实处理自己业务逻辑的服务器地址
反向代理.png
无论是正向还是反向代理,除了上面两个场景的使用之外,还有其他的作用,试想,我们在经营一台代理服务器,它专门接受其他用户的请求,作为中转,我们是否可以做这样一件事情,对于一些热门的站点,比如google,facebook。当我们请求回来之后,将其缓存到本次硬盘,当下一次有同样请求过来的时候,我们就可以直接返还本地的资源,而不需要重复请求。可见代理还可以提高访问速度。另外,我们对于请求的过滤是不是也可以放在代理服务器上,这样业务服务器可以专心的进行后台逻辑的计算,所以代理还可以起到防火墙的作用。
实际的网络结构,正向代理和反向代理往往是同时存在: