openretry动态upstream
openretry动态upstream
nginx.conf upstram配置。
lua_package_path "$prefixlua/?.lua;;"; # http块
upstream dyn_backend {
server 0.0.0.0;
balancer_by_lua_block {
local bs = require "bs"
bs.run_peer()
}
keepalive 10;
}
lua代码
目录 /usr/local/openresty/nginx/lua bs.lua
local balancer = require "ngx.balancer"
local servers = ngx.shared.servers;
local _M = { _VERSION = '1.0' }
function _M.run_peer()
local res = servers:get("uri");
local res2 = servers:get("port");
-- balancer_by_lua_block 不能连接redis, 使用共享变量解决ngx.shared.servers,从另外的地方定时更新这个变量,以达到动态效果
local servers = {
{res, tonumber(res2)}
}
balancer.set_timeouts(1, 0.5, 0.5) -- 后端的连接和读写超时时间
balancer.set_more_tries(2) -- 连接失败后最多在重试 2 次
local n = math.random(#servers) -- 这里使用随机算法作为示例
local ok, err = balancer.set_current_peer( -- 设置使用的后端服务器
servers[n][1], servers[n][2]) -- 使用 IP 地址和端口号
if not ok then -- 检查是否设置成功
ngx.log(ngx.ERR, "failed to set peer: ", err)
return ngx.exit(500)
end
end
return _M
location /capture {
content_by_lua '
local servers = ngx.shared.servers
servers:set("uri", "127.0.0.1")
servers:set("port", "8080")
ngx.say(servers:get("port"))
';
}
动态location
location /exec {
content_by_lua '
local test = require "test"
test.redis_test()
';
}
location /upstream {
internal;
set $my_upstream $my_upstream;
set $my_uri $my_uri;
proxy_pass http://$my_upstream$my_uri;
}
local _M = { _VERSION = '1.0' }
function _M:redis_test()
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local res, err = red:get("my_upstream")
local res2, err = red:get("my_uri")
ngx.var.my_upstream = res
ngx.var.my_uri = res2
ngx.exec("/upstream")
end
return _M