OpenResty基于来源IP和QPS来限流

桶原理

我们可以想像:

有一只上面进水、下面匀速出水的桶,如果桶里面有水,那刚进去的水就要存在桶里等下面的水流完之后才会流出,如果进水的速度大于水流出的速度,桶里的水就会满,这时水就不会进到桶里,而是直接从桶的上面溢出。

对应到处理网络请求,水代表从客户端来的请求,而桶代表一个队列,请求在该队列中依据先进先出(FIFO)算法等待被处理。漏的水代表请求离开缓冲区并被服务器处理,溢出代表了请求被丢弃并且永不被服务。

Nginx 经典限流法

ngx_http_limit_req_module 和 ngx_http_limit_conn_module,可以在代理层面对服务进行限流和熔断。

复制代码
http {

    # 请求限流定义1:
    # - $binary_remote_addr:限制对象(客户端)
    # - zone:定义限制(策略)名称
    # - 10m:用十兆空间记录访问次数
    # - rate:每秒10次的请求处理速率
    limit_req_zone $binary_remote_addr zone={limits-name}:10m rate=10r/s;
    
    # 请求限流定义2:
    # - $server_name:限制对象,对指定服务器请求的限制
    limit_req_zone $server_name zone={limits-name}:10m rate=10r/s;
                
    server {
        location /search/ {
            # 引用以上定义的限流策略,做以下设定(漏桶方式)
            # - burst:最多接收6个排队用户IP(从0开始计数),处于等待处理状态(容量)
            # - nodelay:超出排队之外的更多请求,拒绝并返回503(溢出)
            limit_req zone={limits-name} [burst=5] [nodelay];
        }
    }
}

参考

bash 复制代码
## 
https://blog.csdn.net/cold___play/article/details/132094865

##
https://blog.csdn.net/qq_42402854/article/details/133554410

QPS限流

使用OpenResty进行限流的几种常见方法:

按QPS(每秒查询率)限流:

使用ngx_http_limit_req_module模块,可以限制每个客户端的请求速率。这个模块使用漏桶算法来控制请求的速率。

在Nginx配置文件中,你可以这样设置:

复制代码
http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

    server {
        location / {
            limit_req zone=mylimit burst=5 nodelay;
        }
    }
}

按来源IP限流

使用 ngx_http_limit_conn_module模块,可以限制同时处理的连接数。如果你想根据来源IP地址进行限流,可以像这样配置

bash 复制代码
http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            limit_conn addr 3;
        }
    }
}

这个配置限制了每个IP地址同时只能有3个活跃连接。实际要根据生产的情况来。

相关推荐
杨了个杨89821 天前
Tengine与OpenResty
openresty
曹天骄1 天前
OpenResty 源站安全隔离设计在边缘计算架构中的工程实践
安全·边缘计算·openresty
快乐肚皮6 天前
OpenResty:Nginx的进化之路
nginx·junit·openresty
landonVM9 天前
OpenResty 的性能优化配置建议
性能优化·openresty
我发在否18 天前
OpenResty > Lua断点调试
vscode·lua·断点·openresty·luapanda
oMcLin24 天前
如何在 CentOS 7 上通过配置和调优 OpenResty,提升高并发 Web 应用的 API 请求处理能力?
前端·centos·openresty
笑笑�1 个月前
OpenResty + nginx_upstream_check_module 构建主动健康检查模块
运维·nginx·负载均衡·openresty
Wang's Blog1 个月前
Lua: Web应用开发之OpenResty与Lapis框架深度指南
lua·openresty
驯龙高手_追风1 个月前
OpenResty+NtripCaster实现挂载点负载均衡使用初探
junit·负载均衡·openresty
秃了也弱了。1 个月前
OpenResty+redis实现基于ip的代理层灰度发布
redis·tcp/ip·openresty