这个场景是限制单个连接的下载速度,还有限制单个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的连接和并发

限制某一段时间内同同一个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每秒只能成功访问一次服务端来理解。

其他的选择

测试配置

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参数限速的更多相关文章

  1. nginx 获取请求头,URL参数

    获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...

  2. Nginx重写请求后将url?后的参数去除

    2019独角兽企业重金招聘Python工程师标准>>> 使用?结尾     注意,关键点就在于"?"这个尾缀.重定向的目标地址结尾处如果加了?号,则不会再转发传递 ...

  3. 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. web服务器-Nginx下载限速

    web服务器-Nginx下载限速 一. 限速介绍 在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配. 限流(rate limiting)是N ...

  5. Nginx目录保护、防盗链、限速及多域名处理

    http://www.opsers.org/server/nginx-directory-protection-anti-hotlinking-processing-speed-and-multi-d ...

  6. nginx rewrite和根据url参数location

    最近项目中涉及到旧老项目迁移,需要在nginx上做些配置,所以简单学习了下,好记性不如烂笔头,先记下来. rewrite 首先查看下nginx是否支持rewrite: ./nginx -V 不支持说明 ...

  7. 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 ...

  8. 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂

    最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...

  9. java解析出url请求的路径和参数键值对类 - 转

    import java.util.HashMap; import java.util.Map; public class CRequest { /** * 解析出url请求的路径,包括页面 * @pa ...

随机推荐

  1. How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer

    How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer 1 ...

  2. 如何优雅地退出python程序

    如何优雅地退出python程序 一个单模的python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. is_running = ...

  3. Android下拉列表控件spinner-andoid学习之旅(十一)

    废话不多说,下拉列表常用的就是spinner控件. 直接上代码: package peng.liu.testview; import android.app.Activity; import andr ...

  4. 2.QT中使用资源文件,程序打包

     1 程序中使用资源文件 A  一个QT空项目 B  右击项目,添加新文件 添加后的效果是 C  右击main.prc,选择"添加现有项",找到要使用的资源文件.最终的效果是: ...

  5. 【图的DFS】图的DFS非递归算法

    在DFS的递归算法中,DFS框架如下: 1访问起点v0 2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问. 3若该图为非连通图,则图中一定还存在未被访问的顶点 ...

  6. m2eclipse Error:ArtifactTransferException: Failure to transfer org.apache.felix:org.apache.felix.res

    Issue: When you create and compile a project with pom.xml using m2eclipse, it may report some error ...

  7. Troubleshooting Autoinvoice Import

    metalink :1089172.1 In this Document   Purpose   Troubleshooting Steps   AutoInvoice Execution Repor ...

  8. iOS中 UIToolBar 技术分享

    UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏.当设置UIToolBar显示,或者存在UITabBarController且tabbar被隐藏的时候 ...

  9. STL:list用法详解

    list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间. ...

  10. 阿里电话面试问题----100万个URL如何找到出现频率最高的前100个?

    内推阿里电话面试中面试官给我出的一个题: 我想的头一个解决方案,就是放到stl 的map里面对出现的频率作为pair的第二个字段进行排序,之后按照排序结果返回: 下面口说无凭,show your co ...