[root@nginx-cluster lua]# cat ip_acl_redis.lua local redis = require "resty.redis" local red = redis:new() red:set_timeout(1000,1000,1000) -- 1 sec local ok,err = red:connect("127.0.0.1",6379) if not ok then ngx.say("failed to connect: ",err) return end ngx.log(ngx.INFO, " ok: ", ok, " type(ok): ", type(ok)," err: ", err)
--- 获取代理头部中透传的真实客户端地址 local headers=ngx.req.get_headers() local ip = headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr
--- 判断ip是否set中的元素,若存在则返回为1,若不存在则返回0 local res, err = red:sismember('block-ip-list', ip) if 1 == res then ngx.log(ngx.INFO, "client ip in block-ip-list: ", ip) ngx.exit(ngx.HTTP_FORBIDDEN) else ngx.log(ngx.INFO, "client ip not in block-ip-list: ", ip) end
[root@nginx-cluster lua]# cat comm/ip_acl.lua local _M = {}
function _M.is_member(client, ip_set, client_ip) local res, err = client:sismember(ip_set, client_ip) if 1 == res then return true else return false end end
function _M.redis_client(host,port,pass) local redis = require "resty.redis" local client = redis:new() client:set_timeout(1000,1000,1000) -- 1 sec local ok,err = client:connect(host,port) if not ok then ngx.say("failed to connect: ",err) return end ngx.log(ngx.INFO, " ok: ", ok, " type(ok): ", type(ok)," err: ", err) return client end return _M
[root@nginx-cluster lua]# cat ip_acl_redis2.lua local param = require("comm.ip_acl")
local client = param.redis_client("127.0.0.1", 6379, "")
--- 设置redis名单 keyname local keyname local keyname = nil == keyname and ngx.var.host..":"..ngx.var.server_port..":"..ngx.var.uri or keyname local ip_set = "ip-set:"..keyname ngx.log(ngx.INFO, "ip_set: ", ip_set)
--- 获取代理头部中透传的真实客户端地址 local headers=ngx.req.get_headers() local client_ip = headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr
--- 判断ip是否set中的元素,若为真则返回为1 if param.is_member(client,ip_set,client_ip) then ngx.log(ngx.INFO, "client ip : "..client_ip.." is in set: "..ip_set) ngx.exit(ngx.HTTP_FORBIDDEN) return end