赞
踩
在高并发场景下,为了减轻服务器的压力,nginx采取了“限流三板斧”(我自己命名的,哈哈)。下面我们一一介绍这三种算法以及,nginx的配置。
1)配置
首先看下官网吧 http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
ngx_http_limit_req_module 模块是 0.7.21版本后新增的模块,默认已经安装。
http {
......
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
location / {
# 设置状态码以响应被拒绝的请求而返回
limit_req_status 520;
limit_req zone=one;
}
配置完重启nginx
参数说明:
$binary_remote_addr 客户端ip(还有$server_name,限制虚拟服务器的请求,参考nginx文档)
binary_ 的目的是压缩内存占用量。
zone=one:10 在内存中开辟一块10M的空间,命名为one
rate=1r/s 每秒只接受1个请求
解释:不难看出以ip限速,是以客户为一个单位限速的,也就是你的请求速度和我请求速度都是1个请求每秒。流出速率是一样的。
2)现象
一秒请求一次,返回正常,如果1秒内请求多次就会出现503(如果你设置了错误code会返回你设置的),说明其他请求被格挡掉了。
1)配置
http {
......
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
location / {
# 设置状态码以响应被拒绝的请求而返回
limit_req_status 520;
limit_req zone=one burst=5;
}
参数说明:
burst=5 缓冲5个请求,相当于在桶里放了5个请求,请求的流出速率还是1,没进入桶内的请求在zone缓冲区内等待,所有的请求不抛弃。
2)现象
我连续请求多次,可以发现所有的请求都成功了,但是速率还是一秒一个请求的处理。
1)配置
http {
......
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
location / {
# 设置状态码以响应被拒绝的请求而返回
limit_req_status 520;
limit_req zone=one burst=5 nodelay;
}
参数说明:
nodelay 这个配置在上一个配置做了写处理,桶里还是会缓存5个请求,但是桶外的请求会直接丢弃,桶内的请求会并发立即处理。
2)现象
JMeter下载地址 https://jmeter.apache.org/download_jmeter.cgi
可以看到桶内的请求会立马全部并发执行,其他的没进来的就直接丢弃掉了。
总结:
在实际生产环境中,服务器配置的参数还需要根据实际测试结果来定义,因为每个公司的业务场景不一样,所以需要设置符合自己公司的参数。多应用压力测试工具,比如apche的ab测试工具,JMeter等
配置
http {
......
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
location / {
# 设置状态码以响应被拒绝的请求而返回
limit_req_status 520;
limit_req zone=one burst=5 nodelay;# limit_rate_after 500k;
# 单位默认是字节
limit_rate 1k;
}
现象:可以看见,下载速度几乎是每秒1k左右。
总结:
这个配置是带宽的限制来限制用户的流量,主要应用在下载视频或者图片资源之类的场景中。
配置1:
http {
......
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=two:10m;
location / {
# 设置状态码以响应被拒绝的请求而返回
limit_req_status 520;
limit_req zone=one burst=5 nodelay;# 单位默认是字节
limit_rate 1k;
# 一个用户最多只能并发1个连接
limit_conn two 1;
}
配置2:
http {
# 定义限流策略
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 搜索服务的虚拟主机
server {
location / {
# 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。
limit_conn perip 1;
# 对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,#只有当 request header 被
#后端 server 处理后,这个连接才进行计数。
limit_conn perserver 10 ;
}
}
}
总结:
这个配置是修改用户的并发请求个数或者是服务器总共并发请求数,来减轻服务器的压力。
nginx的这几种配置和相互配合使用,一起来限制请求,减轻服务器压力。三板斧还是比较好使的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。