Nginx 负载均衡和反向代理 [5]

一、负载均衡

负载均衡是一种集群技术,旨在解决高并发场景下的服务问题。其硬件环境模型可以由一台前置服务器和多台服务能力等价的后端服务器表示。前置服务器负责请求的接收,并以某种负载均衡策略将客户端请求分发到后端处理,实现业务量的合理分配,避免后端服务器出现一台设备繁忙,而其他设备资源得不到充分利用的情况。

二、反向代理

反向代理(Reverse Proxy)指以代理服务器接收客户端连接请求,将请求转发给后置服务器,并从后置服务器上取得结果返回给客户端。当一台代理服务器能够代理外部网络上的主机访问内部网络时,这种代理服务的方式称为反向代理服务。

三、Nginx负载均衡和反向代理配置实例

Nginx是一款高性能,轻量级的Web服务器,自带反向代理和负载均衡功能。

3.1 配置实例

其负载均衡配置语法是:

upstream proxy_pass_name {
​   server name weight=NUMBER max_fails=NUMBER fail_timeout=TIME;
​   server name weight=NUMBER max_fails=NUMBER fail_timeout=TIME;
​   ……
}

upstream指令作用域是http,用于声明反向代理服务器集群,它的成员可以是一台至多台后置服务器。server指定声明每台后置服务器的名称和参数,其配置项说明如下:

  • name: 可以是一个域名、一个IP地址、端口号或UNINX Socket
  • weight:服务器被分配的权重。权重越大,收到的分发请求越多,缺省权重为1
  • max_fails:待定
  • fail_timeout:待定
  • down:标记服务器为永久离线状态,用于ip_hash指令
  • backup:仅仅在非backup服务器全部宕机或繁忙的时候才启用

在server{...}虚拟主机内,可以通过proxy_pass指令设置进行反向代理的upstream服务器集群,如:

location / 
{
    # 如果后端服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    # 指定反向代理服务器集群
    proxy_pass http://proxy_pass_name;
    # proxy_set_header指令用于在向反向代理的后端web服务器发起请求时添加指定的Header头信息。当后端服务器上有多个基于域名的虚拟主机时,要通过添加Header头信息Host,用于指定请求的域名,这样后端web服务器才能识别该反向代理访问请求由哪一个虚拟主机来处理
    proxy_set_header Host www.nginxdomain.com;
    proxy_set_header X-Forwarded-For $remote_addr;
}

3.2 负载均衡策略

3.2.1 轮询

upstream模块是Nginx负载均衡的主要模块,缺省提供轮询方式的负载均衡,即将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

3.2.2 ip_hash

ip_hash
语法:ip_hash
默认:none
使用上下文:upstream

ip_hash指令通过哈希计算,能够将来自某个IP的请求始终分发到同一台后置服务器上。使用ip_hash指令无法保证后置服务器的负载均衡,某些后置服务器接收到的请求可能比其他服务器要多,此时upstream语法中设置的后置服务器权重是不生效的。

注意:在某些架构设计下,如果已启用ip_hash,且后端服务器要从upstream服务器集群中摘除,必须将该服务器标记为"down",而不能直接从配置文件中删除或注释。比如原先由3台服务器组成upstream集群,注释掉backend_2服务器对应的server配置后,Nginx会对剩下的2台服务器重新hash,原先被哈希到backend_1的客户端IP可能被哈希到已摘除的backend_2服务器上,导致服务出现异常。

正确的示范如下方代码块中所示:

upstream backend {
    ip_hash;
    server backend_1.example.com;
    server backend_2.example.com down;
    server backend_3.example.com;
}

3.2.3 加权轮询

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

3.2.4 随机

通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问

3.2.5 least_conn(最小连接数法)

由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

四、Nginx负载均衡服务器的双机高可用

如果前置服务器只有一台Nginx,当发生Nginx服务器单点故障时,整个网站都会不可用。因此,需要组建Nginx负载均衡服务器群组,实现故障转移与高可用。

双机高可用一般通过虚拟 IP 方式实现,目前分为2种实现方式:

  • 一台主服务器 + 一台热备服务器,正常情况下主服务器绑定一个公网虚拟 IP,提供负载均衡服务,热被服务器处于空闲状态。当主服务器发生故障时,热被服务器接管主服务器的虚拟 IP,提供负载均衡服务
  • 两台服务器都处于活动状态,各自绑定一个公网虚拟 IP,提供负载均衡服务,当其中一台服务器发生故障时,另一台服务器接管发生故障服务器的虚拟 IP

你可能感兴趣的:(Nginx 负载均衡和反向代理 [5])