mirror of
https://github.com/bunkerity/bunkerized-nginx
synced 2023-12-13 21:30:18 +01:00
performance - cache dns responses
This commit is contained in:
parent
75f3d6490a
commit
e36c743c70
2 changed files with 46 additions and 5 deletions
|
@ -77,17 +77,20 @@ function cachestore:get(key)
|
|||
clusterstore:close()
|
||||
if ret[1] == ngx.null then
|
||||
ret[1] = nil
|
||||
end
|
||||
if ret[2] < 0 then
|
||||
ret[2] = -1
|
||||
elseif ret[2] < 0 then
|
||||
ret[2] = ret[2] + 1
|
||||
end
|
||||
return ret[1], nil, ret[2]
|
||||
end
|
||||
local callback_no_miss = function()
|
||||
return nil, nil, -1
|
||||
end
|
||||
local value, err, hit_level
|
||||
if self.use_redis then
|
||||
value, err, hit_level = self.cache:get(key, nil, callback, key)
|
||||
else
|
||||
value, err, hit_level = self.cache:get(key)
|
||||
value, err, hit_level = self.cache:get(key, nil, callback_no_miss)
|
||||
end
|
||||
if value == nil and err ~= nil then
|
||||
return false, err
|
||||
|
|
|
@ -325,6 +325,14 @@ utils.get_resolvers = function()
|
|||
end
|
||||
|
||||
utils.get_rdns = function(ip)
|
||||
-- Check cache
|
||||
local cachestore = utils.new_cachestore()
|
||||
local ok, value = cachestore:get("rdns_" .. ip)
|
||||
if not ok then
|
||||
logger:log(ngx.ERR, "can't get rdns from cachestore : " .. value)
|
||||
elseif value then
|
||||
return cjson.decode(value), "success"
|
||||
end
|
||||
-- Get resolvers
|
||||
local resolvers, err = utils.get_resolvers()
|
||||
if not resolvers then
|
||||
|
@ -347,17 +355,30 @@ utils.get_rdns = function(ip)
|
|||
if answers.errcode then
|
||||
return {}, answers.errstr
|
||||
end
|
||||
-- Return all PTR
|
||||
-- Extract all PTR
|
||||
local ptrs = {}
|
||||
for i, answer in ipairs(answers) do
|
||||
if answer.ptrdname then
|
||||
table.insert(ptrs, answer.ptrdname)
|
||||
end
|
||||
end
|
||||
-- Save to cache
|
||||
local ok, err = cachestore:set("rdns_" .. ip, cjson.encode(ptrs), 3600)
|
||||
if not ok then
|
||||
logger:log(ngx.ERR, "can't set rdns into cachestore : " .. err)
|
||||
end
|
||||
return ptrs, "success"
|
||||
end
|
||||
|
||||
utils.get_ips = function(fqdn, ipv6)
|
||||
-- Check cache
|
||||
local cachestore = utils.new_cachestore()
|
||||
local ok, value = cachestore:get("dns_" .. fqdn)
|
||||
if not ok then
|
||||
logger:log(ngx.ERR, "can't get dns from cachestore : " .. value)
|
||||
elseif value then
|
||||
return cjson.decode(value), "success"
|
||||
end
|
||||
-- By default perform ipv6 lookups (only if USE_IPV6=yes)
|
||||
if ipv6 == nil then
|
||||
ipv6 = true
|
||||
|
@ -406,7 +427,7 @@ utils.get_ips = function(fqdn, ipv6)
|
|||
if #res_errors == #qtypes then
|
||||
return false, cjson.encode(res_errors)
|
||||
end
|
||||
-- Return all IPs
|
||||
-- Extract all IPs
|
||||
local ips = {}
|
||||
for i, answers in ipairs(res_answers) do
|
||||
for j, answer in ipairs(answers) do
|
||||
|
@ -415,6 +436,11 @@ utils.get_ips = function(fqdn, ipv6)
|
|||
end
|
||||
end
|
||||
end
|
||||
-- Save to cache
|
||||
local ok, err = cachestore:set("dns_" .. fqdn, cjson.encode(ips), 3600)
|
||||
if not ok then
|
||||
logger:log(ngx.ERR, "can't set dns into cachestore : " .. err)
|
||||
end
|
||||
return ips, cjson.encode(res_errors) .. " " .. cjson.encode(ans_errors)
|
||||
end
|
||||
|
||||
|
@ -629,4 +655,16 @@ utils.add_ban = function(ip, reason, ttl)
|
|||
return true, "success"
|
||||
end
|
||||
|
||||
utils.new_cachestore = function()
|
||||
-- Check if redis is used
|
||||
local use_redis, err = utils.get_variable("USE_REDIS", false)
|
||||
if not use_redis then
|
||||
logger:log(ngx.ERR, "can't get USE_REDIS variable : " .. err)
|
||||
else
|
||||
use_redis = use_redis == "yes"
|
||||
end
|
||||
-- Instantiate
|
||||
return require "bunkerweb.cachestore":new(use_redis)
|
||||
end
|
||||
|
||||
return utils
|
Loading…
Reference in a new issue