openresty+lua 动态更新upstram里的server (下)lua实现动态更新upstream,openrestyupstram
openresty+lua 动态更新upstram里的server (下)lua实现动态更新upstream,openrestyupstram
如果基础环境没有配置的话,请到上篇,https://blog.csdn.net/u014686399/article/details/80225843
步骤一:更新自带的lualib/resty/upstream/healthcheck.lua
(1)备份一下lualib/resty/upstream/healthcheck.lua
(2)在合适的地方添加一个函数,一定要在return _M之前
--judge user_define
local function match_user_define(host,port)
local user_define,message=get_user_define()
local stop_sign=false
local server=host..':'..port
if not user_define then
error(message)
else
local value, flags=user_define:get(server)
if value == 0 then
stop_sign=true
end
end
return stop_sign
end
--end user define
(3)修改check_peer函数,如下
--[[if peer.host then
-- print("peer port: ", peer.port)
ok, err = sock:connect(peer.host, peer.port)
else
ok, err = sock:connect(name)
end--]]
mathch_result=match_user_define(peer.host, peer.port)
if not mathch_result then
if peer.host then
-- print("peer port: ", peer.port)
ok, err = sock:connect(peer.host, peer.port)
else
ok, err = sock:connect(name)
end
else
ok=nil
peer.down=false
err=" The user defines the state of the host to stop"
end
(4)修改openresty的http模块,添加下面参数
lua_shared_dict user_define 1m;
(5)重启openresty,看一下errlog是不是有报错,有报错是不正常的
步骤二
(1)在lualib下创建upstream_update.lua
local _M = { _VERSION = '1.0' } local function split( str,reps ) local resultStrList = {} string.gsub(str,'[^'..reps..']+',function ( w ) table.insert(resultStrList,w) end) return resultStrList end local function get_user_define() local user_define=ngx.shared['user_define'] if not user_define then return nil, "share memory variable[user_define] not found" else return user_define, "" end end --add server to user_define local function common_user_define(func_name) user_define,message=get_user_define() if not user_define then ngx.say("failed to get share memory variable [user_define]: ", message) return end ngx.req.read_body() local args, err = ngx.req.get_post_args() if err == "truncated" then -- one can choose to ignore or reject the current request here end if not args['server'] then ngx.say("failed to get post args: ", err) return else if type(args['server']) ~= 'table' then server_list=split(args['server'],',') else server_list=args['server'] end func_name(server_list,user_define) end end local function add_user_func(server_list,user_define) for _,value in ipairs(server_list) do --table.insert(user_define,value) succ, err, forcible=user_define:set(value, 0) if not succ then ngx.say("failed to set share memory variable [user_define]", err) return nil end end local temp_list=user_define:get_keys() ngx.say("OK,all server: ", table.concat(temp_list,", ")) return user_define end function _M.add_user_define() common_user_define(add_user_func) end --del server to user_define local function del_user_func(server_list,user_define) for _,value in ipairs(server_list) do succ, err, forcible=user_define:delete(value) if not succ then ngx.say("failed to set share memory variable [user_define]", err) break end end local temp_list=user_define:get_keys() ngx.say("OK,all server: ", table.concat(temp_list,", ")) end function _M.del_user_define() common_user_define(del_user_func) end return _M
(2)修改nginx.conf的server模块
location /add_user_define {
content_by_lua '
local user_fun = require "upstream_update"
user_fun.add_user_define()
';
}
location /del_user_define {
content_by_lua '
local user_fun = require "upstream_update"
user_fun.del_user_define()
';
}
(3)重启一下openresty,看一下errlog,不出现报错是正常的状态
步骤三:测试
(1)访问http://192.168.0.17:8000//index.html,连续两次应该能发现,会转发到192.168.0.16和192.168.0.17
(2)curl -X POST -d "server=192.168.0.16:80&server=192.168.0.17:80" http://192.168.0.17:8000/add_user_define 去掉所有的server,然后再访问http://192.168.0.17:8000//index.html,会得到
errlog:
页面:
(3)curl -X POST -d "server=192.168.0.16:80" http://192.168.0.17:8000/del_user_define,放开192.168.0.16,然后访问http://192.168.0.17:8000//index.html,会得到192.168.0.16的页面
如果有不清楚的请到 630300475qq群。
评论暂时关闭