基本概念

当有 2 台或以上服务器时,代理服务器根据规则将请求分发到指定的服务器上处理,实际上是对反向代理的合理运用

  • 转发功能:按照指定的规则进行轮询将请求转发给所有应用服务器,减轻单机压力,提高并发量
  • 故障移除:通过心跳检测判断应用服务器状态,自动标记宕机服务器并将请求发送给其他应用服务器
  • 恢复添加:检测到发生故障的应用服务器恢复正常,会自动将其添加到处理用户请求的服务器集群中

    编译说明

    编译安装时增加 stream 参数:
    1
    2
    ./configure --with-stream
    make && make install

    转发策略

    客户端请求由多个服务器进行处理,客户端请求默认按时间顺序依次转发(轮询)到不同的应用服务器,并且会自动剔除停机的后端服务
参数 说明
weight 默认为 1,数值越大,负载的权重就越大
max_fails 请求超时次数,默认为 1,与 fail_timeout 结合使用
fail_timeout 请求超时时间,与 max_fails 结合使用
backup 标记为备用服务器,其他服务器忙碌时,请求会被转到这里
down 标记为服务器停机,不参与负载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
upstream hyperf {
server 127.0.0.1:9501 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9502 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9503 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9504 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9505 weight=1 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name api.yuwei.cc;

ssl_certificate /etc/nginx/ssl/api.yuwei.cc.pem;
ssl_certificate_key /etc/nginx/ssl/api.yuwei.cc.key;

access_log /dev/null;
error_log /var/log/nginx/error_api.yuwei.cc.log;

location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://hyperf;
}

设置权重

指定轮询几率,即 weight

1
2
3
4
5
6
7
8
upstream hyperf {
server 127.0.0.1:9501 weight=3;
server 127.0.0.1:9502 weight=2;
server 127.0.0.1:9503;
server 127.0.0.1:9504;
server 127.0.0.1:9505 weight=2;
}
......

  • 权重越高分配到需要处理的请求越多
  • 可以与 least_conn 和 ip_hash 结合使用
  • 比较适合服务器的硬件配置差别比较大的情况

    ip_hash

    请求按访问 ip 的 hash 分配,每个访客会固定访问一个后端服务,可以解决 Session 不能跨服务器的问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    upstream hyperf {
    ip_hash;
    server 127.0.0.1:9501 weight=1;
    server 127.0.0.1:9502 weight=2;
    server 127.0.0.1:9503 weight=3;
    server 127.0.0.1:9504 weight=4;
    server 127.0.0.1:9505 weight=5;
    }
    ......
  • nginx v1.3.1 之前的版本不能在 ip_hash 中使用权重(weight)
  • ip_hash 不能与 backup 同时使用
  • 此策略适合有状态服务,比如 Session
  • 当有服务器需要剔除,必须手动 down 掉

    least_conn

    选取活跃连接数与权重的比值最小的服务器处理下一个请求,上一次已选和已达到最大连接数的不在选择范围;适合请求处理时间长短不一造成服务过载的情况
    1
    2
    3
    4
    5
    6
    7
    8
    9
    upstream hyperf {
    least_conn;
    server 127.0.0.1:9501 weight=1;
    server 127.0.0.1:9502 weight=2;
    server 127.0.0.1:9503 weight=1;
    server 127.0.0.1:9504 weight=1
    server 127.0.0.1:9505 weight=1;
    }
    ......

    其他策略

    以下策略已经十多年没更新,不确定新版 Nginx 能正常用,建议忽略

    fair

    需要在编译安装时添加 nginx-upstream-fair 模块,Nginx 官网
    1
    2
    ./configure --add-module=/absolute/path/to/nginx-upstream-fair
    make && make install
    请求按响应时间来分配,响应时间短的优先分配
    1
    2
    3
    4
    5
    6
    7
    8
    9
    upstream hyperf {
    fair;
    server 127.0.0.1:9501;
    server 127.0.0.1:9502;
    server 127.0.0.1:9503;
    server 127.0.0.1:9504;
    server 127.0.0.1:9505;
    }
    ......

    url_hash

    需要在编译时添加 nginx_upstream_hash 模块
    1
    2
    ./configure --add-module=/path/to/this/directory
    make && make install
    请求按访问 URL 的 hash 分配,使每个 URL 定向到同一个后端服务,后端服务为缓存时比较有效
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    upstream hyperf {
    #在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用 hash 算法
    hash $request_uri;
    hash_method crc32;
    server 127.0.0.1:9501;
    server 127.0.0.1:9502;
    server 127.0.0.1:9503;
    server 127.0.0.1:9504;
    server 127.0.0.1:9505;
    }
    ......
    Nginx TCP 负载均衡原理上和 LVS 等是一致的,工作在更为底层,性能比 HTTP 负载均衡高不少;不过比不上 LVS,Nginx 工作在用户态,LVS 直接是内核模块,Nginx 相对比较重。