openresty+lua 动态更新upstram里的server (下)lua实现动态更新upstream

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Lua-Resty-Checkups是一个基于luaupstream管理和健康检查模块,由又拍云开源。特点:支持周期性upstream服务管理操作支持管理和健康检查支持upstream动态更新有利于加权轮询或哈希平衡支持 Nginx C upstream同步操作可使用级别和键值实现集群使用简介:-- config.lua _M = {} _M.global = {     checkup_timer_interval = 15,     checkup_shd_sync_enable = true,     shd_config_timer_interval = 1, } _M.ups1 = {     cluster = {         {             servers = {                 {host="127.0.0.1", port=4444, weight=10, max_fails=3, fail_timeout=10},             }         },     }, }lua_package_path "/path/to/lua-resty-checkups/lib/checkups/?.lua;/path/to/config.lua;;"; lua_shared_dict state 10m; lua_shared_dict mutex 1m; lua_shared_dict locks 1m; lua_shared_dict config 10m; server {     listen 12350;     return 200 12350; } server {     listen 12351;     return 200 12351; } init_worker_by_lua_block {     local config = require "config"     local checkups = require "resty.checkups.api"     checkups.prepare_checker(config)     checkups.create_checker() } server {     location = /12350 {         proxy_pass http://127.0.0.1:12350/;     }     location = /12351 {         proxy_pass http://127.0.0.1:12351/;     }     location = /t {         content_by_lua_block {             local checkups = require "resty.checkups.api"             local callback = function(host, port)                 local res = ngx.location.capture("/" .. port)                 ngx.say(res.body)                 return 1             end             local ok, err             -- connect to a dead server, no upstream available             ok, err = checkups.ready_ok("ups1", callback)             if err then ngx.say(err) end             -- add server to ups1             ok, err = checkups.update_upstream("ups1", {                     {                         servers = {                             {host="127.0.0.1", port=12350, weight=10, max_fails=3, fail_timeout=10},                         }                     },                 })             if err then ngx.say(err) end             ngx.sleep(1)             ok, err = checkups.ready_ok("ups1", callback)             if err then ngx.say(err) end             ok, err = checkups.ready_ok("ups1", callback)             if err then ngx.say(err) end             -- add server to new upstream             ok, err = checkups.update_upstream("ups2", {                     {                         servers = {                             {host="127.0.0.1", port=12351},                         }                     },                 })             if err then ngx.say(err) end             ngx.sleep(1)             ok, err = checkups.ready_ok("ups2", callback)             if err then ngx.say(err) end             -- add server to ups2, reset rr state             ok, err = checkups.update_upstream("ups2", {                     {                         servers = {                             {host="127.0.0.1", port=12350, weight=10, max_fails=3, fail_timeout=10},                             {host="127.0.0.1", port=12351, weight=10, max_fails=3, fail_timeout=10},                         }                     },                 })             if err then ngx.say(err) end             ngx.sleep(1)             ok, err = checkups.ready_ok("ups2", callback)             if err then ngx.say(err) end             ok, err = checkups.ready_ok("ups2", callback)             if err then ngx.say(err) end     } }Lua 配置示例:_M = {} -- Here is the global part _M.global = {     checkup_timer_interval = 15,     checkup_timer_overtime = 60,     default_heartbeat_enable = true,     checkup_shd_sync_enable = true,     shd_config_timer_interval = 1, } -- The rests parts are cluster configurations _M.redis = {     enable = true,     typ = "redis",     timeout = 2,     read_timeout = 15,     send_timeout = 15,     protected = true,     cluster = {         {   -- level 1             try = 2,             servers = {                 { host = "192.168.0.1", port = 6379, weight=10, max_fails=3, fail_timeout=10 },                 { host = "192.168.0.2", port = 6379, weight=10, max_fails=3, fail_timeout=10 },             }         },         {   -- level 2             servers = {                 { host = "192.168.0.3", port = 6379, weight=10, max_fails=3, fail_timeout=10 },             }         },     }, } _M.api = {     enable = false,     typ = "http",     http_opts = {         query = "GET /status HTTP/1.1\r\nHost: localhost\r\n\r\n",         statuses = {             [500] = false,             [502] = false,             [503] = false,             [504] = false,         },     },     mode = "hash",     cluster = {         dc1 = {             servers = {                 { host = "192.168.1.1", port = 1234, weight=10, max_fails=3, fail_timeout=10 },             }         },         dc2 = {             servers = {                 { host = "192.168.1.2", port = 1234, weight=10, max_fails=3, fail_timeout=10 },             }         }     } } _M.ups_from_nginx = {     timeout = 2,     cluster = {         {   -- level 1             upstream = "api.com",         },         {   -- level 2             upstream = "api.com",             upstream_only_backup = true,         },     }, } return _M
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值