我的目标是防止基于用户IP的高频请求,google了一下openresty,发现可以用lua玩。所以我写了下面的脚本,我是 Lua 的新手,谁能给我一些关于这个脚本的建议,甚至纠正我。

此脚本用于阻止在 100 秒内请求超过 3 次的请求

local limit_request_times = 3 
local expire_time = 100 
 
local user_ip = ngx.var.remote_addr 
 
-- ngx.say("user_ip: ", user_ip) 
 
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.say("failed to connect: ", err) 
    return 
end 
 
 
local res, err = red:get(user_ip) 
if res == ngx.null then 
    ngx.say("no request record, add this user_ip to redis") 
    ok, err = red:set(user_ip, 1) 
    if not ok then 
        -- ngx.say("add user_ip failed") 
        ngx.exit(ngx.HTTP_FORBIDDEN) 
        return 
    else 
        red:expire(user_ip, expire_time) 
    end 
else 
    if tonumber(res) == limit_request_times then 
        -- ngx.say("request reach max limit times") 
        ngx.exit(403) 
        return 
    else 
        ok, err = red:incr(user_ip) 
        if not ok then 
            ngx.say("failed to increment request times") 
            return 
        else 
            ngx.say("increment request times: ", res + 1) 
        end 
    end  
end 

请您参考如下方法:

为什么不直接使用内置的 nginx ngx_http_limit_req_module

例如我们限制来自一个 IP 地址的请求每分钟不超过 2 个。

http { 
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m; 
 
... 
 
server { 
 
    ... 
 
    location /search/ { 
        limit_req zone=one burst=3 nodelay; 
    } 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!