如果基础环境没有配置的话,请到上篇,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
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群。