使用Nginx 做负载均衡


Nginx可以作为一个非常高效的负载均衡系统,通过分发HTTP请求到多个应用服务器来提高整个系统的吞吐量,性能和可用性。

负载均衡的算法/机制

下面是Nginx支持的机制

  • 轮询机制 轮询算法

  • 最少连接,把下一个请求分发到活动负载最少的服务器
  • ip哈希,根据客户端的IP地址的哈希值来映射到处理请求的服务器

默认负载均衡配置

最简单的负载均衡配置:

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

    server {
        listen 80;

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

在上面的例子中,有三个相同的应用服务运行在ser1-ser3三个服务器中。如果没有指定均衡机制,默认为轮询方法。所有的请求都被代理到myapp1 服务组,Nginx会使用轮询算法分发请求。

Nginx还可以代理HTTPS,gRPC等协议的请求,如果要支持HTTPS请求只要修改http-> https即可

最少连接机制

相比轮询方法,在有些请求需要更多处理时间的情况下,最少连接方式可以获得更好的平衡。
基于最少连接机制,Nginx不会分发请求到负载过多的服务器,而是把新请求分发到负载最少的服务器。

least_conn 指令为服务组(server group)配置的一部分

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

会话持久化

如果使用轮询或者最少连接机制,同一个客户端的请求可能会分发给不同的服务器。如果需要保持一个会话来保存例如:用户登录状态、购物车信息。需要把同一个客户端的请求分发到同一个服务器来使用会话,这种情况下IP哈希算法派上了用场。

IP哈希算法机制,用客户端的IP地址作为哈希算法的key来决定处理请求的服务器。 配置如下..

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

基于权重的负载均衡

在上面的例子中没有配置服务器的权重,所以对于特定的负载均衡机制每台服务器都是等价的。但是如果有的服务器配置更高,可以通过配置更高的权重使权重高的服务器处理更多请求。

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

在这个配置中,如果有5个请求,那么3个请求会被分发给sev1,1个分发给sev2,1个分发给sev3.这里是轮询机制,但对于其他机制也是同样的配置。

健康检查

如果一个服务器的请求返回失败,Nginx会把这个服务器标识为失败,在一段时间内接下来的请求会避开失败的服务器。max_fails指令配置失败多少次才把服务标识为失败,默认为1.如果设置为0则标识不启用健康检查。fail_timeout指令配置如果服务标识为失败了,多少时间后才重试。如果重试的时候成功了标识为失败的服务器会重新标识为正常。


参考: http://nginx.org/en/docs/http/load_balancing.html

上一篇:C#程序设计基础【变量常量,数据类型,输入输出,应用程序的调试】


下一篇:NetScaler 10.1的配置以及结合StoreFront的部署