Ограничить частоту запросов каждого IP с помощью NGINX & Lua



Моя цель состоит в том, чтобы предотвратить высокий частый запрос, основанный на IP пользователя, и я google openresty и обнаружил, что он может быть воспроизведен с Lua. Поэтому я написал следующий сценарий, я новичок в Lua, может ли кто-нибудь дать мне совет по этому сценарию или даже поправить меня.



этот скрипт должен блокировать запрос, который запрашивает более 3 раз в 100s



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
679   1  

1 ответ:

Почему бы просто не использовать nginx build-in ngx_http_limit_req_module?

Например, мы ограничиваем не более 2 запросов в минуту с одного IP-адреса.

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;

...

server {

    ...

    location /search/ {
        limit_req zone=one burst=3 nodelay;
    }

Comments

    Ничего не найдено.