Nginx 负载均衡

1,281 阅读5分钟

前言:

现代高流量网站必须以快速可靠的方式处理来自用户或客户端的数十万(如果不是数百万)并发请求,并返回正确的文本、图像、视频或应用程序数据。为了经济高效地扩展以满足这些高容量,现代计算最佳实践通常需要添加更多服务器。

一个负载均衡器充当“交通警察”坐在你的服务器前面,横跨能够履行最大化速度和容量利用率,确保没有一台服务器超负荷工作的方式,可能会降低性能这些请求的所有服务器路由客户端请求. 如果单个服务器出现故障,负载平衡器会将流量重定向到其余的在线服务器。将新服务器添加到服务器组时,负载均衡器会自动开始向其发送请求。

什么是负载均衡?

负载均衡是指在一组后端服务器(也称为服务器群服务器池) 之间有效地分配传入网络流量。

什么是 Nginx 负载均衡

通过上文简单的概念介绍,你可能对负载均衡有了一个初步的了解,知道它是一种调度策略。那么问题来了,Nginx 又是什么呢?Nginx 如何实现负载均衡?这就要从正向代理和反向代理说起了。

正向代理(forward proxy) :是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

  比如国内访问谷歌,直接访问是不行的,我们可以通过一个能够访问谷歌的正向代理服务器,请求发到代理服务器,由代理去谷歌获取数据并返回,这样就变相的实现了访问谷歌的需求。

  一句话总结:正向代理,就是代理服务器代理了客户端,去和目标服务器进行交互。

8caf69f16d5e44da9b432adc38eaea88.png

正向代理的用途

  • 突破 IP 访问限制
  • 通过缓存加速访问资源
  • 隐藏客户端真实 IP
  • 客户端访问授权

反向代理(Reverse Proxy) :与正向代理正好相反,反向代理中的代理服务器,代理的是服务器那端。代理服务器接收客户端请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器的角色。

  反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。

  一句话总结:反向代理,就是代理服务器代理了目标服务器,去和客户端进行交互。

3f4c149e09344ed6ac04e6078936e11f.png

反向代理的用途

  • 隐藏服务器真实 IP
  • 负载均衡
  • 通过缓存加速访问资源
  • 提供安全保障

总结

正向代理,就是代理服务器代理了客户端,去和目标服务器进行交互。现实生活中的场景:黄牛买票。

反向代理,就是代理服务器代理了目标服务器,去和客户端进行交互。现实生活中的场景:房屋中介。

实现Nginx负载均衡的组件

Nginx http功能模块模块说明
ngx_http_proxy_moduleproxy代理模块,用于把请求后抛给服务器节点或upstream服务器池。
ngx_http_upstream_module负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查。

Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。

   upstream www_server_pool {
    server 10.0.0.7 weight=5;
    server 10.0.0.16 weight=10;
}

参数详解:

1、upstream是关键字必须要有,后面的www_server_pool为一个Upstream集群组的名字,可以自定义;

2、server是关键字固定,后面可以接域名或IP。如果不指定端口,默认是80。结尾有分号。

3、weight代表权重,数值越大分配的请求就越多。

nginx负载均衡常见算法

轮询

原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails1次),则在失效时间fail_timeout10秒)内不会再转发请求到该节点~

upstream defaultReverseProxyServer{
    server 192.168.0.1:8080; 
    server 192.168.0.2:8080; 
}

权重

原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails默认1次或可设置N次),则在失效时间fail_timeout默认10秒,可设置N秒)内,不会再转发请求到该节点~

upstream weightReverseProxyServer{
    server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s;
    server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s;
}

ip_hash

原理是每一个请求按用户访问IP的哈希结果分配,如果请求来自同一个用户IP则固定这台IP访问一台应用服务器,该算法可以有效解决动态网页中存在的session共享问题。

upstream ipHashReverseProxyServer{
    ip_hash;
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
}

一般使用的是基于权重的算法,因为现在很多情况下都是集群部署,而且集群下的各个服务器资源大多都是不均匀的,资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力~