目录

Nginx 负载均衡

目录

Nginx 以高并发、低消耗而闻名,这个特点使其很适合作为一个负载均衡器 (Load Balancer),有策略地分发请求给不同的后端服务器。避免单点故障之余,亦增强整个系统的可用性,简单说不容易宕机。负载均衡是反向代理的其中一个用途。

负载均衡

Module ngx_http_upstream_module

反向代理的优势:

  • 隐藏真实服务器;
  • 负载均衡便于横向扩充后端动态服务;
  • 动静分离,提升系统健壮性。

Nginx 实现负载均衡的策略:

1
2
3
4
5
6
7
upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}
server address [parameters];

parameters:

  • weight=number 设置服务器的权重,默认为 1。
  • max_conns=number 限制与number代理服务器的同时活动连接的最大值。默认值为零,表示没有限制。

默认不写参数就是 weight=1 相当于轮询。将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户;weight 和访问比率成正比,用于后端服务器性能不均的情况。

load balancing method

  • hash 指定客户端-服务器映射基于散列key值的服务器组的负载平衡方法。可以包含文本、key变量及其组合。请注意,从组中添加或删除服务器可能会导致将大部分密钥重新映射到不同的服务器。
  • ip_hash:基于客户端 IP 地址在服务器之间分配请求。来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。
  • least_conn:将请求传递到具有最少活动连接数的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则使用加权循环平衡方法依次尝试它们。
  • least_time 将请求传递到平均响应时间最短且活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则使用加权循环平衡方法依次尝试它们。
  • random 将请求传递到随机选择的服务器,同时考虑服务器的权重。

在配置反向代理和负载均衡等等功能之前,有两个核心模块是我们必须要掌握的,这两个模块应该说是 Nginx 应用配置中的核心,它们分别是:upstream 、proxy_pass 。

在 upstream 内可使用的指令:

  • server 定义上游服务器地址;
  • zone 定义共享内存,用于跨 worker 子进程;
  • keepalive 对上游服务启用长连接;
  • keepalive_requests 一个长连接最多请求 HTTP 的个数;
  • keepalive_timeout 空闲情形下,一个长连接的超时时长;
  • hash 哈希负载均衡算法;
  • ip_hash 依据 IP 进行哈希计算的负载均衡算法;
  • least_conn 最少连接数负载均衡算法;
  • least_time 最短响应时间负载均衡算法;
  • random 随机负载均衡算法。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}