Skip to main content

负载均衡

Nginx配置上游服务负载均衡(upstream

基本语法

upstream的基本语法如下,一个upstream需要设置一个名称,这个名称可以在server里面当作proxy host使用。

upstream gateway {
server localhost:9000;
}

一个upstream可以设置多个server,通常情况下Nginx会轮询每一个server,从而达到最基本的负载循环效果。

upstream gateway {
server localhost:9000;
server localhost:9001;
}

max_fails

max_fails是最多出错数量,可以为每一个server设置一个max_fails,如果请求server发生了错误则max_fails会加一,如果请求server错误次数达到了max_fails后,Nginx会标记这个server为故障状态,后面就不会再去请求它了。

默认情况下,max_fails的次数是1次。

upstream gateway {
server localhost:9000 max_fails=5;
server localhost:9001 max_fails=3;
}

fail_timeout

fail_timeout是故障等待超时时间,前面说过了max_fails是请求server错误次数,如果达到了max_fails次数之后server会被标记为故障状态,那么多长时间会重新尝试呢?这个fail_timeout就是这个时间了,在达到max_fails次数之后server进入故障状态,而后在fail_timeout时间之后会被重新标记为正常状态。

默认情况下,fail_timeout的时间是10秒。

upstream gateway {
server localhost:9000 max_fails=5 fail_timeout=100;
server localhost:9001 max_fails=3 fail_timeout=60;
}

proxy_connect_timeout

这个proxy_connect_timeout是连接超时时间,如果连接不到就会报错了。

proxy_connect_timeout 3s;

proxy_next_upstream_tries

这个proxy_next_upstream_tries是一个upstream反向代理的重试次数,简单说就是如果请求server出错的次数达到了proxy_next_upstream_tries的次数的话,即使没有达到max_fails的次数,即使后面还有没有尝试过的server,都不会再继续尝试了,而是直接报错。

proxy_next_upstream_tries 3;

proxy_next_upstream_timeout

这个proxy_next_upstream_timeout是一个upstream反向代理的故障等待时间,简单说就是无论upstream内部如何进行重试,所有花费的时间加在一起达到了proxy_next_upstream_timeout时间的话,就会直接报错,不会再继续尝试了。

proxy_next_upstream_timeout 60s;

backup

这个是备用服务器参数,可以为一个upstream设置一个backup的server,在生产server全部都出问题之后,可以自动切换到备用server上,为回复服务争取时间。

backup的server不同于其他server,平时是不承载请求的,所以它应该是比较空闲的状态,应急再合适不过了~~

upstream gateway {
server localhost:9000 max_fails=5 fail_timeout=100;
server localhost:9001 max_fails=3 fail_timeout=60;
server localhost:9002 backup;
}

使用

http {

upstream gateway {
server localhost:9000 max_fails=5 fail_timeout=100;
server localhost:9001 max_fails=3 fail_timeout=60;
server localhost:9002 backup;
}

server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://gateway;
}
}
}

负载均衡分配策略

默认情况下采用的是轮询策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。

Nginx支持的负载均衡调度算法方式如下

  • weight轮询(默认,常用)

接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

  • ip_hash(常用)

每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

  • fair

智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。

  • url_hash

按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

动静分离

为了加快服务器的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。