当前位置: 首页 > article >正文

Nginx限速原理、配置与测试

 转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


1. Nginx限速的场景

Nginx限速是工作中常见的配置需求,对于nginx限速一般有两种场景:

  • 限制某个用户在一个给定时间段内能够产生的HTTP请求数,防止短时间内产生大量HTTP请求数,占用服务器过多进程来处理;

  • 限制访问的请求速率,一是在下载场景保护磁盘IO,也防止DDOS攻击;

2. Nginx限速的原理

Nginx限速的原理之一是漏斗原理,它的核心思想是:缓存请求,匀速处理,多余的请求直接丢弃。

3. Nginx限速的实现方法

Nginx一般通过这两个模块实现限速:

ngx_http_limit_req_module:
  limit_reg_zone:用来限制单位时间内的请求数,即速率限制;
ngx_http_limit_conn_module:
  limit_req_conn:用来限制同一时间连接数,即并发限制;

4. Nginx限速的案例

案例一:基于IP对访问速率做限制,限制每秒处理1次请求,突发请求不超过3个,对突发超过3个以后的请求放入缓存区sre。

http {
   limit_req_zone $binary_remote_addr zone=sre:5m rate=1r/s;
   server {
       listen       80;
       location /sre2024/ {
         limit_req zone=sre burst=3 nodelay;
   }
}

配置参数说明:

limit_req_zone $binary_remote_addr zone=sre:5m rate=1r/s;
第一个参数: $binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的⽬目的是缩写内存占用量,是限制同⼀客户端ip地址。
第二个参数: zone=sre:5m 表示生成一个大小为5M,名字为sre的内存区域,用来存储访问的频次信息。
第三个参数: rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

limit_req zone=sre burst=3 nodelay;
第一个参数: zone=sre 设置使用哪个配置区域来做限制, 与上面limit_req_zone 里的name对应。
第二个参数: burst=3 这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
第三个参数: nodelay 如果设置了nodelay,超过访问频次而且缓冲区也满了的时候就会直接返回错误提示,如果没有设置,则所有请求会等待排队,有些请求就会延迟很长时间。

① 修改配置文件:

② 创建测试数据文件:

[root@test102 conf]# echo "This is limit test.">../html/sre2024/index.html

③ 命令行和web测试访问结果:

案例二:基于IP做连接限制,限制同一IP并发为1,限制下载速度为100K

http {
  limit_conn_zone $binary_remote_addr zone=sre:5m;
  server {
    location /sre2024/ {
         limit_conn sre 1; 
	 limit_rate 100k;
    }
  }
}

配置参数说明:

limit_conn sre 1:限制IP并发连接数,显示1个IP只能发起一个链接;
limit_rate 100k:表示限速100k;

① 修改配置文件:

② 创建测试文件:

# dd if=/dev/zero of=../html/sre2024/testfile bs=1M count=300

③ 测试对比:

配置修改前的下载速度:

配置修改后的下载速度:

因加了limit_conn addr 1;配置,所以只限制1个IP同时下载,同时下载速度是100k:

上面两种场景的配置也可以合二为一使用,或者根据单个域名做访问限速,很好用。

欢迎关注SRE成长记一起探讨学习!↓↓↓


http://www.kler.cn/a/450116.html

相关文章:

  • openssl交叉编译(这次基本上正规了)
  • Android自定义吐司三
  • 华为ensp--BGP路由反射器
  • 关于卡尔曼滤波
  • 【杂谈】-为什么Python是AI的首选语言
  • 程控电阻箱应用中需要注意哪些安全事项?
  • 插入块(数据库)、预览图 错误调试
  • python 定时任务管理封装
  • 【js】URL处理
  • 快手后端面试,被面试官秒挂了!
  • HEX文件格式详解
  • flask-admin modelview 中重写get_query函数
  • oracle怎样使用logmnr恢复误删除的数据
  • 优化 HTTP 接口请求:缓存策略与实现方法
  • Leetcode1705:吃苹果的最大数目
  • Jetson xavier 刷机安装教程
  • new 分配空间;引用
  • 电气设计 | 低压接地系统:TN-C 、TN-S、TN-C-S、TT适用哪些场所?
  • vue中proxy代理配置(测试二)
  • 大模型面试快问快答
  • 设计模式--抽象工厂模式【创建型模式】
  • 利用Spring Cloud Gateway Predicate优化微服务路由策略
  • 【wordpress】建立数据库连接时出错,您看到此页面,则表示您在 wp-config.php 文件中定义的用户名和密码信息不正确,或是……
  • QT——day1
  • 畅捷通-条件竞争
  • 前端开发 之 12个鼠标交互特效上【附完整源码】