## 查看所有 upstream location /status_upstream { content_by_lua_block { local upstream = require "ngx.upstream" local us = upstream.get_upstreams() for _, v in ipairs(us) do ngx.log(ngx.INFO, "upstream name:", v) local servers, _ = upstream.get_servers(v)
if not servers then ngx.log(ngx.ERR, "no server in upstream") else for idx, s in ipairs (servers) do local msg = "idx:" .. idx
for k, v in pairs (s) do msg = msg .. " " .. k .. ":" if type(v) == "table" then msg = msg .. table.concat(v, ",") else msg = msg .. tostring(v) end end
ngx.log(ngx.INFO, msg) end end end } }
## 将 backend 中第一个启用 server 设置为 down 状态 location /set_upstream { content_by_lua_block { local upstream = require "ngx.upstream"
在调用 status_upstream、set_upstream、status_upstream 调用顺序中,最终并无法看到 server 被标记为 down 状态。这是 set_peer_down 修改的是 round_robin 模块中 server 的标记,get_servers 读取的是配置结构体(ngx_http_upstream_server_t)中的内容。
2. get_servers 函数
如果 server 未指定 down/backup 标记,在 get_servers 函数返回值中不会包含 down/backup 状态。
三 后记
在 lua-upstream 模块的 TODO 中有提及动态添加、删除 server 的考虑,到时候应该会更好用。