在前端服务去访问后端服务的时候,可能后端访问有多台服务器在运行,前端需要根据当前的服务器情况去自动选择访问后端的其中一台服务器的服务。此时我们就需要使用到NGINX的负载均衡技术实现,众所周知upstream主要是配置均衡池和调度方法,proxy_pass主要是配置代理服务器ip或服务器组的名字。
下面我们看一下具体的配置:

主文件:

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name test.com;

location /test/ {
proxy_pass http://testService;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

upstream文件:

1
2
3
4
upstream testService{
server 192.168.0.101:8001 weight=1; // 下文称为server1
server 192.168.0.102:8002 weight=1; // 下文称为server2
}

首先,upstream只配置了server1服务,test.com可以正常访问;然后server1服务关闭,再启动server2服务,且upstream只配置了server2,test.com可以正常访问。

最后给upstream配置了两个server(如上),server1服务关闭,server2服务启动,发现test.com访问失败。

解决方法:
在配置中增加proxy_connect_timeout配置:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name test.com;

location /test/ {
proxy_pass http://testService;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
}
}

proxy_connect_timeout默认的超时时间是60s,所以在做负载均衡的时候,要合理设置这个值。


总结:nginx负载均衡的五种分配策略,避免后端服务器宕机造成网站不能访问

nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

1
2
3
4
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}

2、指定权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

1
2
3
4
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

3、IP绑定ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

1
2
3
4
5
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

4、fair(第三方的插件:nginx-upstream-fair)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

1
2
3
4
5
upstream backserver {
fair;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

5、url_hash(第三方的插件:nginx_upstream_hash)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

1
2
3
4
5
6
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

在需要使用负载均衡的server中增加proxy_pass http://backserver/

1
2
3
4
5
6
7
8
9
10
upstream backserver{
ip_hash;
#表示单前的server暂时不参与负载
server 127.0.0.1:9090 down; down
#weight 默认为1.weight越大,负载的权重就越大
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
#其它所有的非backup机器down或者忙的时候,请求backup机器
server 127.0.0.1:7070 backup;
}

max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

fail_timeout:max_fails次失败后,暂停的时间