【Nginx】下载,请求限速,根据URL参数限速
这个场景是限制单个连接的下载速度,还有限制单个IP的连接数,或者单位时间内的请求数,实验环境 nginx1.9.x。 小例子为主,具体的细节请多看文档。
限制下载速度
location /download {
limit_rate 128k;
}
#如果想设置用户下载文件的前10m大小时不限速,大于10m后再以128kb/s限速可以增加以下配内容,修改nginx.conf文件
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
限制IP的连接和并发
limit_req_zone 用来限制单位时间内的请求数
limit_req_conn 用来限制同一时间连接数
限制某一段时间内同同一个ip访问的次数
http{
...
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个, 超出频率返回503错误
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
...
server{
...
location / {
...
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
limit_req zone=allips burst=5 nodelay;
...
}
...
}
...
}
上面的配置中key是 $binary_remote_addr ,所以说是根据IP来限速,其实不光是IP,也可以是$server_name等其他的Nginx变量或者是自定义的变量,根据需求来配置。
限制单个IP同一时间的连接数
http{
...
#定义一个名为one的limit_zone,大小10M内存来存储session,
#以$binary_remote_addr 为key,也就是IP
#且只能放在http作用域
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server{
...
location {
...
limit_conn one 20; #连接数限制,超过限制返回503错误
#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
#limit_rate 500k;
...
}
...
}
...
}
根据参数,uri中特殊字符来限速
由于用户都是NAT之后来连接服务器,所以根据IP来限制没法做,但是每个用户访问时的URL都会带有用户唯一的参数,这时候使用url参数比ip更有限速意义。 下面的配置的含义是 /hello这个请求中,lan参数相同的请求每秒钟只能请求一次,可以类比的把lan参数当成用户的IP,每个IP每秒只能成功访问一次服务端来理解。
其他的选择
lua-resty-limit-traffic 基于openresty 的限速模块,使用lua实现更复杂的业务控制
ngx-limit-req2 这个哥们写的一个C 模块
测试配置
map $arg_lan $name {
default $arg_lan;
"~*python" python;
"~*golang" golang;
}
limit_req_zone $name zone=xspython:10m rate=1r/s;
server {
listen 8001;
server_name localhost;
location /hello {
limit_req_log_level notice;
limit_req zone=xspython burst=1 nodelay;
echo hello $name;
}
location ~ /hi {
#不限速对照
echo hi;
}
}
简单测试脚本
#!/bin/bash
#limit_test1.sh
#orangleliu
#第一种情况 同一个key,查看是否能限速
#第二种情况 不同key,是否能顺利通过
#主要是根据access.log来判断结果
op=$1
url="http://127.0.0.1:8001/hello?lan="
if [ $1 = "1" ];then
echo "情况一"
for i in {1..5};do
for j in {1..5};do
curl "${url}python"
done
sleep 1
done
else
echo "情况二"
lanname=(python java golang c lua)
for i in {1..5};do
for j in "${lanname[@]}"; do
curl "${url}${j}"
done
sleep 1
done
fi
【Nginx】下载,请求限速,根据URL参数限速的更多相关文章
- nginx 获取请求头,URL参数
获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...
- Nginx重写请求后将url?后的参数去除
2019独角兽企业重金招聘Python工程师标准>>> 使用?结尾 注意,关键点就在于"?"这个尾缀.重定向的目标地址结尾处如果加了?号,则不会再转发传递 ...
- 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- web服务器-Nginx下载限速
web服务器-Nginx下载限速 一. 限速介绍 在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配. 限流(rate limiting)是N ...
- Nginx目录保护、防盗链、限速及多域名处理
http://www.opsers.org/server/nginx-directory-protection-anti-hotlinking-processing-speed-and-multi-d ...
- nginx rewrite和根据url参数location
最近项目中涉及到旧老项目迁移,需要在nginx上做些配置,所以简单学习了下,好记性不如烂笔头,先记下来. rewrite 首先查看下nginx是否支持rewrite: ./nginx -V 不支持说明 ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂
最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...
- java解析出url请求的路径和参数键值对类 - 转
import java.util.HashMap; import java.util.Map; public class CRequest { /** * 解析出url请求的路径,包括页面 * @pa ...
随机推荐
- Java中读取Excel功能实现_POI
这里使用apache的poi进行读取excel 1,新建javaproject 项目:TestExcel 2,导入包 包下载地址:http://poi.apache.org/download.html ...
- Android的ToggleButton和Switch以及AnalogColok和DigitalColok的用法-android学习之旅(二十)
ToggleButton 和Switch简介 ToggleButton 和Switch都是继承了Button,所以他们的属性设置和Button差不多. 分别支持的属性 ToggleButton 的属性 ...
- Dynamics CRM 2013 Homepage Ribbon 按钮引用多个Javascript资源
在CRM的开发中ribbon的开发是比较重要的一环,很多客制化的功能都需要动用ribbon区,CRM2013中的名字已经改叫command bar了,但从老版本过来的人都还是习惯叫他ribbon. R ...
- 【游戏周边】Unity,UDK,Unreal Engine4或者CryENGINE——我应该选择哪一个游戏引擎
在digital-tutors看到的一篇文章,很多初学者都有这样的疑问,因此翻译到这里. 原文:http://blog.digitaltutors.com/unity-udk-cryengine-ga ...
- Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler
ResultSetHandler负责处理两件事: (1)处理Statement执行后产生的结果集,生成结果列表 (2)处理存储过程执行后的输出参数ResultSetHandler是一个接口,提供了两个 ...
- JSP标签JSTL(4)--URL
<c:url>标签作用是将一个URL地址格式化为一个字符串,并且保存在一个变量当中.它具有URL自动重写功能.value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的 ...
- 读外部存储的权限READ_EXTERNAL_STORAGE
READ_EXTERNAL_STORAGE Added in API level 16 String READ_EXTERNAL_STORAGE Allows an application to re ...
- 管道模式——pipeline与valve
在一个比较复杂的大型系统中,假如存在某个对象或数据流需要被进行繁杂的逻辑处理的话,我们可以选择在一个大的组件中进行这些繁杂的逻辑处理,这种方式确实达到了目的,但却是简单粗暴的.或许在某些情况这种简单粗 ...
- Linux的资源管理器
说是资源管理器,其实就是使用命令来对Linux运行系统的参数的查看.下面就一起看一看怎么像在windows下查看资源管理器吧. 1.查看进程(额,自然是电脑上正在运行的进程咯) ps aux 其中a ...
- 用 boost::multi_index 管理玩家
用 boost::multi_index 管理玩家(金庆的专栏)网游服务器上的玩家集合需要多种索引:如用ID查找,角色名查找, 用登录时分配的会话ID查找.用boost::multi_index进行玩 ...