负载均衡
nginx默认支持四种调度算法
-
轮询(rr)-默认策略
:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器故障,故障系统自动清除,使用户访问不受影响。 -
轮询权值(weight)
:weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况。 -
ip_hash
:每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器,主要解决动态网站session共享的问题。 -
least_conn
: 最少链接数,那个机器连接数少就分发。 -
url_hash-第三方
:按照访问的URL的hash结果来分配请求,是每个URL定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率,nginx本身不支持,如果想使用需要安装nginx的hash软件包。 -
fair-第三方
:这个算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配,默认不支持,如果想使用需要安装upstream_fail模块。
upstream lakerService#自定义组名 {
ip_hash;
server 192.168.0.1:8080 weight=1 max_fails=3 fail_timeout=15;
server 192.168.0.1:8081 weight=1 max_fails=3 fail_timeout=15;
server 192.168.0.1:8082 down;
server 192.168.0.1:8032 backup;
server x2.baidu.com; #可以是域名
#down 不参与负载均衡
#weight=5; 权重,越高分配越多,默认为1。
#backup; 预留的备份服务器,其他所有的非backup机器挂了或者忙的时候,才会请求这个backup机器。
#max_fails 某台server请求允许失败的次数,默认为1。
超过设置次数后,在fail_timeout时间内,新请求不会分配给这机器。
#fail_timeout 超过失败次数后,服务暂停时间,默认为10秒。
某台server达到max_fails次数后,在fail_timeout时间内,nginx认为这台server不可用,不会转发请求给它。
#max_coons 限制分配给某台server最大的接受的连接数,超过设置数量,将不会分配给它新连接,默认为0表示不限制。
#根据服务器性能不同,配置适合的参数
#server 106.xx.xx.xxx; 可以是ip
#server 106.xx.xx.xxx:8080; 可以带端口号
#server unix:/tmp/xxx; 支出socket方式
}
- max_fails 允许请求失败的次数,默认是1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。0表示禁止失败尝试,企业场景:2-3次,京东1次,蓝汛10次,根据业务需求去配置。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间。京东是3s,蓝汛是3s,根据业务需求配置。常规业务2-3秒合理。
例:如果max_fails是5,他就检测5次,如果五次都是502.那么,他就会根据fail_timeout 的值,等待10秒,再去检测。
整体示例
http {
# 定义了一个负载均衡池
upstream lakerService {
# 最大失败次数 3 次,超过 3 次失败后,20 秒内不检测。
server 192.168.10.24:8080 max_fails=1 fail_timeout=5s;
server 192.168.10.24:8081 max_fails=1 fail_timeout=5s;
}
server {
listen 80;
location / {
# 故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
proxy_pass http://lakerService;
}
}
}