nginx 反向代理-负载均衡
前一篇文章讲了反向代理的中转作用
- 实现了把一个复杂的网络地址用简单的地址替换。
- 实现了fastcgi, php的前端代理功能。
其实,反向代理作用远不止这些,下面我们仍以nginx为例:
按照之前的配置:
location /music/{
proxy_pass http://music.baidu.com/;
}
结果:
浏览器上显示的是
192.168.8.6/music/
如果不是图中的”baidu”字眼,你不会这与baidu有什么关系,会以为这是8.6这台机器上布署的业务。
这就起到了反向代理的一个大功能:
后端透明化。
你根本不知道你访问的目标最终在哪里执行,架构如下图:
代理机只是纯粹的代理功能,并不负责执行,至于负责执行的是一台机器还是多台机器,对客户端完全透明。
比如我们在机器上查询一下百度的IP:
[root@myBlog xiaofei]# ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107: icmp_seq=1 ttl=50 time=32.1 ms
你会相信百度全部的服务都是在180.97.33.107这台机器上执行的吗。
负载均衡
那么只有这一台代理机够不够呢?
我们知道单台机器的性能是有瓶颈的,QPS达到10万已经很不错了,像腾讯,阿里这种全网QPS峰值要求1亿的访问,无论是代理机还是执行机都会很常多。
把代理机搞得多多的,每个机器就不是很累,而且一台机器崩溃了其他不受影响。
单点问题
近几年很少有听说BAT的服务出现大状况,最多也就是部分地区电缆被挖断了,只影响部分地区的用户,这是怎么做到的呢?
代理机所代表的业务集群可以有很多个,一个集群出故障了,可以迅速切换到其他集群。
nginx是如何做到代理多个后端(集群)的呢?
除了proxy_pass,我们还需要另一个功能:upsteam.
我们来看看官网上的使用方法:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}server {
location / {
proxy_pass http://backend;
}
}
两个模块的有向图可以是:
upstream可以同时指定多个执行机,当一个执行机断了可以指向其他执行机。
更真实的架构
集群内部的代理机可以理解成集群的网关。
外部代理机与内部代理机一起分担了整个服务的负载。