赞
踩
nginx 负载均衡一共3种方法
最简单的负载均衡设置
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
在上述例子中,设置了3个server,没有指定负载均衡方法,默认是round-robin 轮询。
如果想使用最少连接,则设置least_conn指令。
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
如果想使用ip-hash,适用粘性session场景,则设置ip_hash指令。
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
也可以指定权重,在前边的例子中所有的server都是平等的,如果某台server性能高,想多承接写请求,则使用权重,
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
上边的例子表示,每5个请求,srv1处理3个,srv2、srv3各处理1个。可以将权重和ip-hash、least-conn一起使用,在实践中,通常采用 least-conn与weight联合使用,可以实现更好地负载均衡,防止有的server空闲,它的分配规则是,请求会分配给active conns/weight最小值的server。
通过负载均衡+backup,就可以实现高可用。以下示例表示,当srv1、srv2都不可用时,启用backup。
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com backup;
}
那么srv1、srv2不可用的标准是什么呢?
服务不可用指的是在指定时间内失败尝试达到阈值,比如默认的10秒内失败1次就认为server不可用,那么什么是失败尝试呢?默认失败尝试是三次握手失败或超时(握手超时、read data超时),proxy_next_upstream可以更改默认失败尝试,比如返回500/404则认为失败尝试。如果请求失败,nginx会将请求转发到下一个server。
在fail_timeout
内失败max_fails
次,server会被标记为不可用,fail_timeout
也指定了server恢复间隔,fail_timeout后,会分配一个请求,如果成功,则再将server标识为可用。
在server指令中,指定max_fails(最大失败次数)、fail_timeout(失败超时时间)
upstream backend {
server backend1.example.com weight=5;
//30秒内,失败尝试3次,则server不可用
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
Syntax: proxy_next_upstream error | timeout | invalid_header |
http_500 | http_502 | http_503 | http_504 | http_403 | http_404 |
http_429 | non_idempotent | off …;
Default: proxy_next_upstream error timeout;
Context: http, server, location
Specifies in which cases a request should be passed to the next server:
error
an error occurred while establishing a connection with the server, passing a request to it, or reading the response header;
timeout
a timeout has occurred while establishing a connection with the server, passing a request to it, or reading the response header;
前边提到的server不可用属于入站/被动检测(in band/passive),当请求来了才能知道server可不可用,nginx plus(nginx的商业版)支持主动检测,nginx会按照策略主动发起请求,测试server是否可用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。