引言

跨多个应用服务器的负载平衡是一种常用的技术,用于优化资源利用、最大化吞吐量、减少延迟和确保容错配置。

nginx作为一个高效的HTTP负载均衡器,可以将流量分配到多个应用服务器,提高web应用程序的性能、可伸缩性和可靠性。


Nginx负载均衡配置

1、nginx支持的负载均衡策略:

  • 轮询(round-robin)——请求以循环的方式轮流分发到每个应用服务器
  • 最少连接数(least-connected)——请求被分配给活动连接数量最少的服务器
  • 对ip进行hash(ip-hash)——对客户端的ip进行hash计算,来决定请求应该被分发到哪一台服务器

2、每种负载均衡策略的使用

  • 默认使用的是轮询策略,配置如下:
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}
  • 最少连接数策略,配置如下:
upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
}

当某些请求需要更长的时间才能完成时,最小连接策略使得每个应用服务器上的负载更加公平。nginx尽量不让繁忙的应用服务器因过多的请求而超载,而是将新请求分配给不那么繁忙的服务器。

  • ip hash策略,配置如下:
upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

轮询或最少连接数策略使得同一个客户端的每次请求都可能分发到不同的应用服务器,而某些情况下,我们希望同一个ip的请求连接到同一个服务器(如session共享),此时就可以使用ip hash策略。

ip hash策略用客户端的IP地址作为散列键,以确定此请求应该分发到哪个服务器。这种策略确保来自同一客户端的请求将始终定向到同一服务器,除非该服务器不可用。

3、使用权重

在上面三种负载策略的基础上我们还可以进一步加上权重控制,轮询策略中加上权重配置如下:

upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
}

解释:如果有五个请求,那么有三个会分配到srv1,另外两个分别分配给srv2和srv3.

在高版本的nginx中,最小连接数策略和ip hash策略也可以类似的使用权重。

nginx的健康检查

Nginx自带了健康检查机制,如果一个服务器响应错误,Nginx会暂时标识它为不可用,在后续一段时间内,Nginx会避免将请求分发到此服务器。

max_fails参数设置了在fail_timeout期间与服务器通信的连续不成功尝试的次数,达到此次数后,服务器标识为不可用状态。max_fails默认为1,如果设置为0,则表示禁用了此服务器的健康检查。fail_timeout参数还定义服务器被标记为可不用的时间,fail_timeout默认为10s.

在服务器故障后的fail_timeout间隔之后,nginx会用客户端的请求探测服务器,如果探测成功,此服务器将被标记为可用。

upstream myapp1 {
        server srv1.example.com weight=3 max_fails=5 fail_timeout=10s;
        server srv2.example.com;
        server srv3.example.com;
}