nginx配置限速限流基于内置模块


Posted in Servers onMay 02, 2022

有时候 NGINX 面对一些特殊的场景时,需要进行一定的限速限流的配置,比如一个官网,可能前端静态文件是非常小的,但是同时配置的还有一些 apk 包,这些包如果不做任何限制,可能会形成比较大的负载或者带宽的压力,我这边碰到了,今天就来针对这个问题处理一下。

没有限制之前,对应的包下载速度如下:

nginx配置限速限流基于内置模块

添加如下配置,进行一定的限制:

http {
    ...#省略
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    ...#省略
}
server {
    listen 80 default;
    server_name localhost;
    location ~ "^/test/app/" {
         limit_conn addr 6;
        limit_rate_after 10m;
        limit_rate 1200k;
        limit_conn_status 499;
        limit_conn_log_level warn;
        root  /app;
    }
}

说明:

http 区域,我这里使用的是 1.15 版本的,默认已经安装了对应的模块ngx_http_limit_conn_module。

limit_conn_zone:是一个固定的名称,下边调用的时候与之对应。 $binary_remote_addr:表示通过

remote_addr 这个标识来做限制,“binary_” 的目的是缩写内存占用量,是限制同一客户端 ip 地址。

zone=addr:10m:示生成一个大小为 10M,名字为 addr 的内存区域,用来存储访问的频次信息。

server 区域,可以直接写在 server 区域内,表示限制所有,也可以写到对应的 location 当中,以表示单独区域限制。

limit_conn:表示单个 IP 限制最大连接数为 6。 limit_rate_after:表示请求前 10m 大小时不限速。

limit_rate:表示单个连接最大连接带宽限制为 1200k。 limit_conn_status:设置拒绝请求的返回值。值只能设置400 到 599 之间(默认是 503)。 limit_conn_log_level:定义日志级别,默认 error。

现在简单的做一下测试看看下载速度:

nginx配置限速限流基于内置模块

可以看到对应的速度已经收到限制,而且是在 10M 之后速度开始慢慢下降,直至达到限制的位置。现在可以简单压测看下情况:

$ ab -n 10 -c 10 http://www.test.com/res/app/app-xiaomi-release.apk

这条命令表示请求 10 次对应资源,并发为 10。监控对应日志,看到如下结果,因为我们定义的最大并发是 6,所以将会有 4 个失败,并返回 499 状态码,然后有 6 个成功。

$tailf -n 100 a |awk -F "," '{print  $6}'
"response": "499"
"response": "499"
"response": "499"
"response": "499"
"response": "200"
"response": "200"
"response": "200"
"response": "200"
"response": "200"
"response": "200"

另外在压测命令之后,还有一些输出可以参考:

Total transferred:      403483116 bytes
HTML transferred:       403481400 bytes
Requests per second:    0.18 [#/sec] (mean)
Time per request:       56865.501 [ms] (mean)
Time per request:       5686.550 [ms] (mean, across all concurrent requests)
Transfer rate:          6929.10 [Kbytes/sec] received

其他的不说了,只看最后一条,可以看到总的对外输出是大约7M/s,正好符合单条限制 1.2M/s 乘以 6 的数值。

总结

到此这篇关于nginx配置限速限流基于内置模块的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
Nginx服务器添加Systemd自定义服务过程解析
Mar 31 Servers
Nginx 过滤静态资源文件的访问日志的实现
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
图文详解Nginx版本平滑升级方案
Sep 15 Servers
Nginx实现负载均衡的项目实践
Mar 18 Servers
Kubernetes控制节点的部署
Apr 01 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 Servers
CentOS安装Nginx并部署vue
Apr 12 Servers
nginx 配置缓存
May 11 Servers
鲲鹏 CentOS 7 安装Python3.7
May 11 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
Nginx配置之禁止指定IP访问
centos7安装mysql5.7经验记录
May 02 #Servers
使用 Docker Compose 构建复杂的多容器App
Apr 30 #Servers
搭建Yolov5服务器
KVM基础命令详解
Apr 30 #Servers
Win10 Anaconda安装python-pcl
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 #Servers
You might like
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
PHP和XSS跨站攻击的防范
2007/04/17 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
树莓派升级python的具体步骤
2020/07/05 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
努比亚手机官网:nubia
2016/10/06 全球购物
法学毕业生自我鉴定
2014/01/31 职场文书
《乌塔》教学反思
2014/02/17 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
个人课题方案
2014/05/08 职场文书
留学生求职信
2014/06/03 职场文书
宿舍标语大全
2014/06/19 职场文书
应届大学生求职信
2014/07/20 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python