使用Nginx OpenResty与Redis实现高效IP黑白名单管理
local redis_host = "127.0.0.1"
local redis_port = 6379
local redis_password = "your_redis_password"
-- 初始化Redis连接
local function init_redis(redis_host, redis_port, redis_password)
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 秒超时
local ok, err = red:connect(redis_host, redis_port)
if not ok then
return nil, err
end
if redis_password and redis_password ~= "" then
ok, err = red:auth(redis_password)
if not ok then
return nil, err
end
end
return red
end
-- 检查IP是否在黑名单中
local function is_ip_blacklisted(red, ip)
local blacklist_key = "ip_blacklist"
local is_blacklisted, err = red:sismember(blacklist_key, ip)
if not is_blacklisted then
ngx.log(ngx.ERR, "查询Redis出错: ", err)
return false
end
return is_blacklisted == 1
end
-- 处理请求
local function handle_request()
local red, err = init_redis(redis_host, redis_port, redis_password)
if not red then
ngx.log(ngx.ERR, "连接Redis失败: ", err)
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
local ip = ngx.var.remote_addr
if is_ip_blacklisted(red, ip) then
ngx.log(ngx.ERR, "IP ", ip, " 在黑名单中")
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
-- 继续其他请求处理逻辑
end
handle_request()
这段代码展示了如何使用OpenResty的resty.redis
模块来连接Redis,并检查一个IP地址是否在黑名单中。如果IP在黑名单中,请求将被拒绝。这是一个高效的IP黑名单管理方法,适合在API网关或Web服务中使用。
评论已关闭