ngx_dynamic_limit_req_module结合redis的使用方法
时间: 2023-08-03 08:02:31 浏览: 165
ngx_dynamic_limit_req_module可以结合redis来实现更灵活的限流策略,具体使用方法如下:
1. 安装redis
首先需要安装redis,并启动redis服务。
2. 安装nginx和ngx_dynamic_limit_req_module模块
安装支持ngx_dynamic_limit_req_module模块的nginx版本,并编译安装ngx_dynamic_limit_req_module模块。
3. 配置nginx.conf文件
在nginx.conf文件中添加如下配置:
```
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /api/ {
access_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.log(ngx.ERR, "failed to connect to redis: ", err)
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
local limit_key = ngx.var.binary_remote_addr .. ngx.var.uri
local limit, err = red:incr(limit_key)
if not limit then
ngx.log(ngx.ERR, "failed to incr limit: ", err)
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
if limit > 5 then
ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
end
red:set_keepalive(10000, 100)
}
proxy_pass http://backend;
}
}
}
```
其中,`access_by_lua_block`指令用于在nginx处理请求时执行Lua脚本,通过redis实现动态限流。
在Lua脚本中,首先连接redis,然后根据请求的来源IP地址和URI生成限流的key,使用redis的INCR命令递增限流计数器,如果计数器超过限制值,则返回429 Too Many Requests错误。
4. 重启nginx服务
修改完nginx.conf文件后,需要重启nginx服务才能生效。
以上就是ngx_dynamic_limit_req_module结合redis的使用方法,可以根据自己的需求对Lua脚本进行调整。
阅读全文