• 【2022】Nginx使用相应模块做出访问限制


    本文说一下Nginx的资源限制相关

    Nginx限流限速:限制某个用户在一定时间内产生的http请求

    应用场景:

    • 下载限速:限制用户下载资源的速度
    • 请求限制:限制用户单位时间内所产生的http请求数
    • 连接限制:限制同一时间的连接数并发数

    ngx_http_limit_req_module:请求限制

    该模块用于限制每个定义密钥的请求处理速率,特别是来自单个IP地址的请求的处理速率。限制是使用“泄漏桶”方法完成的。

    • 语法格式:
    limit_req_zone key zone=name:size rate=rate;
    
    limit_req zone=name [burst=number] [nodelay | delay=number];
    
    • 1
    • 2
    • 3
    • 官方配置示例:(可以配置在http层)
    http {
        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    
        ...
    
        server {
    
            ...
    
            location /search/ {
                limit_req zone=one burst=5 nodelay;
                limit_req_status 503}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上示例含义为:

    设置区域部分:

    • $binary_remote_addr:以来源IP,每个IP占4字节
    • zone=one:10m:设置一个名称为one的区域,大小为10M
    • rate=1r/s:每秒的请求数为1个

    调用部分:

    • zone=one:调用的zone为上面定义的one
    • burst=5:并发为5个的缓冲区
    • nodelay:当缓冲区与访问限制都超过了则返回503;不设置的话默认排队
    • limit_req_status:超出限制的访问反回状态码503,可以修改

    你每秒可以访问到的页面是:burst+rate的数量

    ngx_http_limit_conn_module:连接限制

    该模块用于限制每个已定义密钥的连接数,特别是来自单个 IP 地址的连接数。

    • 官方示例:
    http {
        limit_conn_zone $binary_remote_addr zone=addr:10m;
    
        ...
    
        server {
    
            ...
    
            location /download/ {
                limit_conn addr 1;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    该示例含义为:设置一个共享区域,名称为addr,大小为10m;根据这个区域设置每个ip的最大连接数为1 。

    此模块的指令:

    • limit_conn zone number(可以作用于http、server、location):设置每个来源ip的最大连接数,超过限制则返回错误

    limit_rate:限制传输速度

    除此之外还可以定义下载速度,这个功能是使用的是ngx_http_core_module模块的limit_rate_afterlimit_rate功能

    • 官方示例:
    location /flv/ {
        flv;
        limit_rate_after 500k;
        limit_rate       50k;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    此示例说明:你可以正常使用500k,当达到500k之后开始限速,速度为50k。

    综合示例:

    • 限制web服务器单IP处理请求数为1秒一个,触发值为3,同时只能下载一个文件
    • 当下载超过50M后速度限制为100k
    • 如果同时下载超过1个文件,则提示开通VIP
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_conn_zone $binary_remote_addr zone=conn_one:10m;
    
    server {
            listen 80;
            server_name test.yyang.com;
            charset utf8,gbk;
    
            limit_req zone=one burst=3 nodelay;
            limit_conn conn_one 1;
            limit_rate_after 50m;
            limit_rate 100k;
            limit_req_status 432;
            error_page 500 502 503 @error_temp;
    
            location @error_temp {
                    return 302 https://vip.yyang.com;
            }
            location / { 
                    root /data;
                    index index.html;
                    
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    vue-显示linux日志乱码,web终端组
    最大路径和
    Hive DML常见操作
    JDK中动态库加载路径问题,一文讲清
    任务调度线程池基本介绍
    抖音API接口大全
    Linux文本三剑客
    使用docker安装logstash的具体方法
    【AWS】如何用SSH连接aws上的EC2实例(虚拟机)?
    幻兽帕鲁服务器哪家便宜?阿里云腾讯云京东云华为云对比
  • 原文地址:https://blog.csdn.net/qq_42527269/article/details/125872173