ngx_http_upstream_module
用于将多个服务器定义成服务器组,由proxy_pass,fastcgi_pass指令调用。
upstream name
定义后端服务器组,服务器可以在不同的端口上监听。默认是wrr算法。只能在http使用
upstream websrv {
server 11.2.2.228:80;
server 11.2.3.63:80;
}
[root@nginx a]# curl http://www.a.com
11.2.2.228
[root@nginx a]# curl http://www.a.com
11.2.3.63
# 在禁止一台服务之后,nginx会一直将请求反代到正常的主机上去
[root@localhost ~]# systemctl stop httpd
[root@localhost ~]# curl http://www.a.com/index.html
11.2.3.63
两个主机也可以监听的端口不同。
upstream websrv {
server 11.2.3.63:80;
server 11.2.2.228:8080;
}
[root@nginx a]# curl http://www.a.com
11.2.3.63
[root@nginx a]# curl http://www.a.com
11.2.2.228
server address [parameters]
定义upstream中的服务器地址和它们的参数
有下面几个参数
参数 | 解释 |
---|---|
weight=number | 设置权重,默认为1 |
max_conns=number | 连接后端服务器最大并发连接数,默认值为0,无限制 |
max_fails=number | 失败尝试次数,超过此处指定的次数时,server将被指定不可使用。默认为1 |
fail_timeout=time | 后端服务器标记为不可用状态的连接超时时长,默认10 |
backup | 将服务器标记为“备用”,即所有服务器均不可用时启用 |
down | 标记为不可用,配合ip_hash,实现灰度发布 |
PS:fail_timeout指定了连接后端服务器时的超时时长,max_fails是fail_timeout失败之后应该尝试的次数。
示例:
[root@nginx conf.d]# cat a.com.conf
upstream websrv {
server 11.2.3.63:80 weight=2 max_fails=3 fail_timeout=20s;
server 11.2.2.228:8080 weight=1 max_fails=3 fail_timeout=20s;
}
ip_hash
源地址hash调度算法。访问一直调度到第一次访问时调度到的后端服务器
配合down使用。实现灰度发布。
[root@nginx conf.d]# cat a.com.conf
upstream websrv {
ip_hash;
server 192.168.199.103:80 weight=2 max_fails=3 fail_timeout=20s;
server 192.168.199.132:8080 weight=1 max_fails=3 fail_timeout=20s;
}
[root@localhost ~]# curl http://www.a.com/index.html
192.168.199.103
[root@localhost ~]# curl http://www.a.com/index.html
192.168.199.103
least_conn
最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接。
示例:
[root@localhost ~]# for i in {1..100};do sleep 1; curl http://www.a.com/index.html;done
192.168.199.103
192.168.199.103
192.168.199.132
192.168.199.103
192.168.199.103
192.168.199.132
hash key [consistent]
基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合
作用:将请求分类,同一类请求将发往同一个upstreamserver,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用
hash key算法
例如对请求的uri进行hash计算,以大大提高缓存的命中率。
算法是对请求的uri进行hash计算,得出一个值,然后除以后端服务器的权重取模。取模之后得到的数来匹配服务器设置的权重。例如后端的服务器的权重为1和2,那么hash值除以3取模,如果取模是1,则发往1的缓存上。 2就发往2对应的缓存服务器上。 这样就大大提高了缓存命中率
但是这个会有一个问题,如果后端缓存服务器增加或减少,都会导致现有的缓存无法命中,从而导致不通过缓存,将压力都给到后端server主机上。这就叫hash穿透。
hash一致性算法
以$request_uri
为例。
我们先创建一个圆环,这个圆环上有1,2,3...2^32-1
。然后将后端缓存服务器ip根据权重来添加随机数生成一个新的虚拟ip。并对新的ip地址进行hash计算。然后在对2\^32
取模。这样的得出的取模数,就可以把后端缓存服务器放到环上对应的数字上。然后在对请求的uri进行hash计算,并对2\^32
取模,离它最近的缓存服务器就是提供缓存的服务器。但是这样会出现一个问题,环上可能会出现好多request_uri
取模的值离同一台缓存服务器近,导致某一台缓存服务器压力过大。 这叫hash环偏移。
解决这一办法就是将缓存服务器取模之前进行大量的乘法,使之均匀的分布在环上的每一个地方。
以后会补图来解释 。