Nginx模块之limit_conn & limit_req


limit_conn模块

生效阶段:NGX_HTTP_PREACCESS_PHASE阶段

生效范围:全部worker进程(基于共享内存),进入preaccess阶段前不生效,限制的有效性取决于key的设计:依赖postread阶段的realip模块取到真实ip

指令

limit_req模块

指令

限制发生时向客户端返回的错误码

Syntax:	limit_req_status code;
Default:	limit_req_status 503;
Context:	http, server, location

limit_req 与 limit_conn 配置同时生效时, limit_req有效

Example

http {
    geo $limit {
        default 1;
        10.0.0.0/8 0;
        192.168.0.0/64 0;
    }
    
    map $limit $limit_key {
        0 "";
        1 $binary_remote_addr;
    }
    
    limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
    
    server {
        location / {
            limit_req zone=req_zone burst=10 nodelay;
        }
    }
}

这个例子同时使用了geo和map指令。geo块将给在白名单中的IP地址对应的$limit变量分配一个值0,给其它不在白名单中的分配一个值1。然后我们使用一个映射将这些值转为key,如下:

如果$limit变量的值是0,$limit_key变量将被赋值为空字符串

如果$limit变量的值是1,$limit_key变量将被赋值为客户端二进制形式的IP地址

两个指令配合使用,白名单内IP地址的$limit_key变量被赋值为空字符串,不在白名单内的被赋值为客户端的IP地址。当limit_req_zone后的第一个参数是空字符串时,不会应用“流量限制”,所以白名单内的IP地址(10.0.0.0/8和192.168.0.0/24 网段内)不会被限制。其它所有IP地址都会被限制到每秒5个请求。

limit_req指令将限制应用到/的location块,允许在配置的限制上最多超过10个数据包的突发,并且不会延迟转发。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM