nginx之upstream

本文详细介绍了Nginx的ngx_http_upstream_module模块,讲解了如何定义后端服务器组,包括upstream name、server address及其参数、ip_hash、least_conn和hash策略。特别强调了ip_hash和least_conn的调度算法,以及hash一致性算法在提高缓存命中率和应对服务器增减时的作用。内容中还提到了hash穿透和hash环偏移问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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环偏移。

解决这一办法就是将缓存服务器取模之前进行大量的乘法,使之均匀的分布在环上的每一个地方。

以后会补图来解释 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值