Nginx 负载均衡
基本概念
当有 2 台或以上服务器时,代理服务器根据规则将请求分发到指定的服务器上处理,实际上是对反向代理的合理运用
- 转发功能:按照指定的规则进行轮询将请求转发给所有应用服务器,减轻单机压力,提高并发量
- 故障移除:通过心跳检测判断应用服务器状态,自动标记宕机服务器并将请求发送给其他应用服务器
- 恢复添加:检测到发生故障的应用服务器恢复正常,会自动将其添加到处理用户请求的服务器集群中
编译说明
编译安装时增加stream
参数:1
2./configure --with-stream
make && make install转发策略
客户端请求由多个服务器进行处理,客户端请求默认按时间顺序依次转发(轮询)到不同的应用服务器,并且会自动剔除停机的后端服务
参数 | 说明 |
---|---|
weight | 默认为 1,数值越大,负载的权重就越大 |
max_fails | 请求超时次数,默认为 1,与 fail_timeout 结合使用 |
fail_timeout | 请求超时时间,与 max_fails 结合使用 |
backup | 标记为备用服务器,其他服务器忙碌时,请求会被转到这里 |
down | 标记为服务器停机,不参与负载 |
1 | upstream hyperf { |
设置权重
指定轮询几率,即 weight1
2
3
4
5
6
7
8upstream 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
9upstream 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
9upstream 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 install1
2
3
4
5
6
7
8
9upstream 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 模块请求按访问 URL 的 hash 分配,使每个 URL 定向到同一个后端服务,后端服务为缓存时比较有效1
2./configure --add-module=/path/to/this/directory
make && make installNginx TCP 负载均衡原理上和 LVS 等是一致的,工作在更为底层,性能比 HTTP 负载均衡高不少;不过比不上 LVS,Nginx 工作在用户态,LVS 直接是内核模块,Nginx 相对比较重。1
2
3
4
5
6
7
8
9
10
11upstream 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;
}
......
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 君玉自牧!