lua_shared_dict addresses_cache 10m;
server {
listen 80;
server_name example.com;
location / {
access_by_lua_block {
local mysql = require "resty.mysql"
local key = ngx.var.host .. ngx.var.uri
local cache = ngx.shared.addresses_cache
-- 从缓存中获取数据
local address = cache:get(key)
if not address then
-- 缓存中不存在,从数据库查询,并更新缓存
local db, err = mysql:new()
if not db then
ngx.log(ngx.ERR, "failed to create mysql object: ", err)
return ngx.exit(500)
end
db:set_timeout(1000)
local ok, err, errno, sqlstate = db:connect{
host = "127.0.0.1",
port = 3306,
database = "mydb",
user = "myuser",
password = "mypassword"
}
if not ok then
ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errno, " ", sqlstate)
return ngx.exit(500)
end
local res, err, errno, sqlstate = db:query("SELECT address FROM addresses WHERE host = '" .. ngx.var.host .. "' AND uri = '" .. ngx.var.uri .. "'")
if not res then
ngx.log(ngx.ERR, "bad result: ", err, ": ", errno, ": ", sqlstate, ".")
return ngx.exit(500)
end
address = res[1] and res[1].address or "" -- 假设地址数据在第一行
cache:set(key, address, 60) -- 将结果存入缓存,缓存时间为60秒
end
ngx.var.proxy_pass = "http://" .. address -- 将地址作为反向代理目标
}
proxy_pass $proxy_pass;
}
}
代码未经测试