Nginx负载均衡

介绍

  • 跨多个应用程序实例的负载平衡是常用的 优化资源利用率、最大化吞吐量的技术, 减少延迟,并确保容错配置。

  • 可以使用nginx作为非常有效的HTTP负载均衡器来 将流量分配到多个应用程序服务器并改进 使用 nginx 的 Web 应用程序的性能、可扩展性和可靠性。

负载均衡方式

中支持以下负载平衡机制(或方法) nginx:

  • 轮询(round-robin): 分发对应用程序服务器的请求 以循环赛的方式,
  • 最少连接 (least-connected):下一个请求分配给服务器,其中 最少的活动连接数,
  • ip-hash(ip-hash) : 哈希函数用于确定哪个服务器应该 为下一个请求选择(基于客户端的 IP 地址)。

默认负载平衡配置(轮询 round-robin)

使用 nginx 进行负载平衡的最简单配置可能看起来 如下所示:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

在上面的示例中,同一应用程序有 3 个实例 在 SRV1-SRV3 上运行。 如果未专门配置负载平衡方法, 它默认为轮循机制。 所有请求都代理到服务器组 myapp1,nginx 应用 HTTP 负载 平衡以分发请求。

nginx中的反向代理实现包括HTTP的负载平衡, HTTPS,FastCGI,uwsgi,SCGI,memcached和GRPC。

要为 HTTPS 而不是 HTTP 配置负载平衡,只需使用“https” 作为协议。

为 FastCGI、uwsgi、SCGI、memcached 或 GRPC 设置负载平衡时,请分别使用 fastcgi_passuwsgi_passscgi_passmemcached_pass 和 grpc_pass 指令。

最少连接的负载平衡(least-connected)

  • 另一个负载均衡规则是连接最少的。 最少连接允许控制应用程序的负载 在某些请求的情况下更公平地实例 需要更长的时间才能完成。
  • 使用最少连接的负载平衡,nginx将尝试不使 繁忙的应用程序服务器具有过多的请求,分发新的 请求改为对不太繁忙的服务器的请求。
  • nginx 中的最少连接负载平衡在将 least_conn 指令用作服务器组配置的一部分时被激活.

案例

http {
    upstream myapp1 {
        least_conn; #最少连接
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

 会话持久性(ip-hash)

  • 请注意,使用轮询或最少连接的负载平衡,每个后续客户端的请求可能分发到不同的服务器中。 不能保证同一客户端将始终是定向到同一服务器。
  • 如果需要将客户端绑定到特定的应用程序服务器 。换句话说,使客户端的会话始终指向特定服务器中从而保证cookie session的可用。使用用  ip_hash的平衡机制。
  • 使用ip_hash,客户端的 IP 地址用作哈希密钥确定应为服务器组中的哪个服务器选择 客户的要求。此方法可确保来自同一客户端的请求将始终定向到同一服务器 ,除非此服务器不可用。

要配置 IP 哈希负载平衡,只需将ip_hash指令添加到服务器组配置:

http {
    upstream myapp1 {
        ip_hash; #ip_hash
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

加权负载平衡

  • 每台被代理的服务器可能一定是同一配置,为了保证每一台服务器都健康运行。可以为每台服务器配置权重。
  • 特别是普通轮询的负载均衡,不同配置服务器以统一权重处理请求,很难保证所有服务器完成得足够快。
  • 请注意不只是轮询的方式可以加权“最少连接”与“ip_hash”同样适用。

为服务器指定权重参数时:

http {
    upstream myapp1 {
        server srv1.example.com weight=3; #定义权重3
        server srv2.example.com;#默认权重1
        server srv3.example.com;#默认权重1
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

此配置,每 5 个新请求将分布在 应用程序实例如下:将定向 3 个请求 对于 SRV1,一个请求将转到 SRV2,另一个请求将转到 SRV3。同样可以使用连接最少和 最新版本的 nginx 中的 IP 哈希负载平衡。

健康检查

  • nginx使用健康检查(Health Checks)来监控后端服务器的状态,并根据检查结果来进行负载均衡和请求分发。
  • 健康检查可以定期检查后端服务器的可用性,并将不可用或异常的服务器暂时从负载均衡池中移除,以确保请求只被发送到健康的服务器。
  • 启用健康检查,你需要使用ngx_http_healthcheck_module模块,该模块在编译Nginx时可选择添加。

示例:

http {
    upstream myapp1 {
        server srv1.example.com weight=3 max_conns=1000 max_fails=2 fail_timeout=3; #定义权重3,最大连接数1000,失败次数2,每3秒重新连接不可用服务,
        server srv2.example.com ;#默认 weight=1 fail_timeout=10秒
        server srv2.example.com ;#默认 weight=1 fail_timeout=10秒
        server srv3.example.com down;#默认权重1;down标记服务不可用
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

 语法:server address [parameters]

  定义服务器。 地址可以指定为域名或 IP 地址,如果未指定端口,则使用端口 80。 解析为多个 IP 地址的域名定义 一次多台服务器。addressparametersunix:

参数说明:

  • weight=number   设置服务器的权重,默认情况下为 1。
  • max_conns=number 限制与代理服务器最大的连接数量。默认值为零,表示没有限制。 如果服务器组不驻留在共享内存中, 该限制适用于每个工作进程。从版本 1.5.9 和版本 1.11.5 开始商用版本才有。
  • max_fails=number max_fails 指令将连续失败的尝试次数设置为 与fail_timeout期间应发生的服务器通信。 默认情况下,max_fails设置为 1。 设置为 0 时,将禁用此服务器的运行状况检查。 fail_timeout 参数还定义服务器标记为失败的时间长度。 服务器故障后的fail_timeout间隔后,nginx将开始正常 使用实时客户端的请求探测服务器。 如果探测成功,服务器将标记为活动服务器。
  • fail_timeout=time 异常服务重连时间默认10秒。
  • down 异常服务重连时间标记服务永久不可用。
  • backup将服务器标记为备份服务器。当主服务器不可用时,使用改服务器。该参数不能与haship_hash, random一起使用。

backup参数不能与haship_hash, random一起使用说明:

  • 负载均衡方法的性质不适合与备份服务器一起使用:haship_hashrandom负载均衡方法都基于特定的算法来选择后端服务器。其中,haship_hash会根据请求的某些属性(如客户端IP)选择服务器,而random则会随机选择服务器。这些方法的目的是实现负载均衡和请求分发,而不是提供备份服务器的功能。因此,在这些负载均衡方法下,备份服务器的作用会失去意义。

  • 备份服务器的选择是根据主服务器的可用性来进行的:backup参数的作用是定义后备服务器,主要在主服务器不可用时起作用。它会接管主服务器的请求处理,以确保服务的高可用性。然而,负载均衡方法需要根据特定的算法选择服务器,无法兼顾备份服务器的角色。因此,backup参数与这些负载均衡方法的同时使用会导致功能冲突。

 

posted @ 2023-08-19 11:04  _dagger  阅读(71)  评论(0)    收藏  举报