nginx的负载均衡

本文来自 http://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_methods

1. 简介

跨多个应用实例的负载均衡(load balancing)是优化资源利用率(optimizing resource utilization),最大化吞吐量(maximizing throughput),减少延迟(reducing latency),确保容错配置(ensuring fault-tolerant configurations)的通用方法。

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

2. 负载均衡策略

nginx支持以下负载均衡策略(或方法):

  • 轮询(round-robin)—— 将请求以轮询的方式分发给服务器
  • 最少连接(least-connected)—— 将请求分配给活动连接最少的服务器
  • IP 哈希(ip-hash)—— 使用一个hash函数(基于客户机的IP地址)来确定请求应该分发给哪个服务器。

2.1. 默认负载均衡配置

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http:\\myapp1;  // 这里应该是 http://myapp1 但是我不会转格式 
        }
    }
}

在上面的示例中,同一个应用程序有3个实例运行在srv1-srv3上。如果没有特别配置负载均衡策略,则默认为轮询。所有请求都代理到服务器组myapp1, nginx应用HTTP负载均衡来分发请求。

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

在为FastCGI、uwsgi、SCGI、memcached或gRPC设置负载均衡时,分别使用fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass和grpc_pass指令。

2.2. 最少连接负载均衡

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

2.3. 持久性会话

请注意,通过轮询或最少连接的负载均衡,每个客户机的请求可能分布到不同的服务器。不能保证将相同客户机的请求定向到特定的服务器
如果需要将客户机绑定到特定的服务器——换句话说,使客户机的会话具有“粘性”或“持久性”,以便总是选择特定的服务器——那么可以使用ip-hash负载均衡机制
使用ip-hash时,将客户机的IP地址用作散列key,以确定应该为客户机请求选择服务器组中的哪个服务器。此方法确保来自同一客户机的请求总是指向同一服务器,除非该服务器不可用

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

2.4. 加权负载均衡

还可以通过使用服务器权重进一步影响nginx负载均衡算法。
在上面的示例中,没有配置服务器权重,这意味着对于特定的负载均衡策略,所有的服务器都被同等对待。
特别是对于轮循,它还意味着请求在服务器上的分布是均等的——只要有足够的请求,并且当请求以统一的方式处理并足够快地完成时。
当为服务器指定权重参数时,该权值将作为负载均衡决策的一部分

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

3. 健康检查

nginx中的反向代理实现包括 in-band(或 passive)服务器健康检查。如果来自特定服务器的响应失败并出现错误,nginx会将此服务器标记为 failed,并暂时避免为后续的请求选择此服务器。

max_failed 指令设置在 fail_timeout 期间尝试与服务器通信的连续失败次数。默认情况下,max_failed设置为1。将其设置为0时,将禁用此服务器的健康检查。fail_timeout参数还定义了服务器被标记为 failed 的时间长度。在服务器故障之后的 fail_timeout 时间间隔之后,nginx将开始使用活动客户机请求优雅地探测服务器 。如果探测成功,则将服务器标记为活动的探测。

你可能感兴趣的:(nginx的负载均衡)