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中break与last的区别详析
Mar 31 Servers
Nginx下配置Https证书详细过程
Apr 01 Servers
Nginx如何配置Http、Https、WS、WSS的方法步骤
May 11 Servers
Nginx虚拟主机的搭建的实现步骤
Jan 18 Servers
图文详解nginx日志切割的实现
Jan 18 Servers
Dashboard管理Kubernetes集群与API访问配置
Apr 01 Servers
Apache Hudi 加速传统的批处理模式
Apr 24 Servers
docker compose 部署 golang 的 Athens 私有代理问题
Apr 28 Servers
KVM基础命令详解
Apr 30 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
nginx之内存池的实现
Jun 28 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
PHP发送短信代码分享
2015/08/11 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
详解如何减少python内存的消耗
2019/08/09 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
JPA的特点
2014/10/25 面试题
技术副厂长岗位职责
2013/12/26 职场文书
品质标语大全
2014/06/21 职场文书
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js