Nginx Lua 防 CC 模块 - 限制访问频率和IP
Nginx Lua 防 CC 模块
该模块使用 Nginx Lua 语言编写,用于限制单个用户和 IP 的访问频率,防止恶意攻击,提高网站稳定性。
核心代码:
function denycc()
if CCDeny then
local uri = ngx.var.uri
CCcount = tonumber(string.match(CCrate, '(.*)/'))
CCseconds = tonumber(string.match(CCrate, '/(.*)'))
local token = getClientIp() .. uri
local limit = ngx.shared.limit
local req, _ = limit:get(token)
if req then
if req > CCcount then
ngx.exit(503)
return true
else
limit:incr(token, 1)
end
else
limit:set(token, 1, CCseconds)
end
end
return false
end
代码说明:
CCDeny:表示是否开启防 CC 功能,建议设置为true。CCrate:控制访问频率,格式为请求次数/秒数,例如10/60表示每分钟最多允许 10 次访问。getClientIp():获取客户端 IP 地址的函数,需要根据实际情况进行调整。ngx.shared.limit:共享内存区域,用于存储访问记录。token:由 IP 地址和 URI 组成,用于标识访问用户。req:获取当前用户访问次数。CCcount:允许的访问次数。CCseconds:允许访问的秒数。
屏蔽 IP 的时间 (900 秒):
可以在函数中添加以下代码来实现:
local limit_ip = ngx.shared.limit_ip
local ip = getClientIp()
if limit_ip:get(ip) then
ngx.exit(503)
return true
else
limit_ip:set(ip, true, 900)
end
这段代码会将客户端的 IP 作为 key,设置一个值为 true 的键值对存储在一个共享内存区域中,有效期为 900 秒。如果在有效期内再次访问该 IP,函数会直接返回 503,拒绝访问。
注意:
ngx.shared.limit和ngx.shared.limit_ip需要在 Nginx 配置文件中进行声明,并设置适当的内存大小。- 该模块只是一个简单的示例,实际应用中需要根据实际情况进行调整和完善。
部署:
- 将代码保存为
denycc.lua文件。 - 在 Nginx 配置文件中添加
lua_shared_dict limit 10m;和lua_shared_dict limit_ip 10m;来声明共享内存区域。 - 使用
location指令将该模块应用到特定的 URL 上,例如:
location / {
content_by_lua 'require 'denycc' denycc()';
...
}
总结:
该防 CC 模块可以有效限制单个用户和 IP 的访问频率,防止恶意攻击,提高网站稳定性。开发者可以根据实际情况进行调整和完善。
原文地址: https://www.cveoy.top/t/topic/oyYE 著作权归作者所有。请勿转载和采集!