Nginx 反向代理的负载均衡中,内置了 轮询、IP分配、URL hash、最小连接、响应时间等几种策略算法
负载均衡的配置为:
http {
# ... 省略其它配置
upstream myserver {
# 默认为轮询算法
server 192.168.0.55:8081;
server 192.168.0.55:8082;
server 192.168.0.55:8083;
}
server {
server_name zengwu.com.cn
listen 80;
location / {
proxy_pass http://myserver;
}
}
# ... 省略其它配置
}
轮询(默认)
轮询是Nginx支持的默认负载均衡策略,轮询策略就是指每个请求会按时间顺序逐一分配到不同的后台服务器上。轮询也是可以附带参数的,可以附加权重、超时等设置,来分配转发策略
说明 | ip |
---|---|
fail_timeout | 与max_fails结合使用,表示max_fails次失败后服务器暂停的时间。 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,默认是1,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,返回proxy_next_upstream模块定义的错误。 |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里,当其他所有的非backup机器down掉或者繁忙的时候才会请求backup服务器,因此这台机器压力会最低。 |
down | 标记服务器永久停机了,表示当前的server暂时不参与负载。 |
weight | 负载的权重,默认为1。weight越大,表示这台服务器被访问的几率就越大。 |
upstream myserver {
server 192.168.0.55:8081;
server 192.168.0.55:8082 backup; # 备用服务
server 192.168.0.55:8083 max_fails=3 fail_timeout=20s; # 3次失败后,停止20秒后再尝试
server 192.168.0.55:8084 weight=2; # 权重为2
}
IP分配
这种策略是按照客户端的IP去分配服务器,使同一个客户端的请求都转发到同一个后台服务器,保证了Session的统一性,可以用来解决Session的跨域问题。
upstream balanceServer {
ip_hash; # 指定负载均衡策略为ip_hash
server 192.168.0.55:8081;
server 192.168.0.55:8082 backup;
server 192.168.0.55:8083 max_fails=3 fail_timeout=20s;
server 192.168.0.55:8084 weight=2;
}
URL Hash
这种策略是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash的话,就可以使得同一个url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
upstream balanceServer {
url_hash; # 指定负载均衡策略为url_hash
server 192.168.0.55:8081;
server 192.168.0.55:8082;
server 192.168.0.55:8083;
server 192.168.0.55:8084;
}
最少连接
这个策略是把请求转发给连接数较少的后端服务器。前面的轮询策略是把请求平均地转发给集群中的每个后台服务器,使得它们的负载大致相同,但是有些请求可能占用的时间会很长,可能导致所在的后端负载过高。这种情况下选用least_conn策略就能达到更好的负载均衡效果。
upstream balanceServer {
least_conn; # 指定负载均衡策略为least_conn
server 192.168.0.55:8081;
server 192.168.0.55:8082 backup;
server 192.168.0.55:8083 max_fails=3 fail_timeout=20s;
server 192.168.0.55:8084 weight=2;
}
响应时间
这种策略是按照服务器的响应时间来分配请求,响应时间短的优先分配。
需要安装nginx-upstream-fair才可以
upstream balanceServer {
fair; # 指定负载均衡策略为fair
server 192.168.0.55:8081;
server 192.168.0.55:8082;
server 192.168.0.55:8083;
server 192.168.0.55:8084;
}