lua
一 概述
lua-upstream
模块提供了对 upstrem
配置的查看,查看所有的 upstream
、upstream
内所有的/启用的/备用的 server
,当前使用的 upstream
名。虽然有 set_peer_down
指令,但是模块只修改单个 worker
内的 server
标记(处理 set_peer_down
请求的 worker
),无法再生产环境使用。
二 示例
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}http {
lua_code_cache off; upstream backend { server localhost:8081 down; server localhost:8082; } server { listen 8081; location / { default_type text/plain; content_by_lua_block { ngx.say("hello world") } } } server { listen 8082; location / { default_type text/plain; content_by_lua_block { ngx.say("hello world 8082") } } } server { listen 8080; ## 查看当前使用的 upstream location /call_upstream { header_filter_by_lua_block { local upstream = require "ngx.upstream" ngx.log(ngx.INFO,"current upstream:", upstream.current_upstream_name()) } proxy_pass http://backend; } ## 查看所有 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" upstream.set_peer_down("backend", false, 0, false) } } }
}
1. 示例运行
在调用 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
的考虑,到时候应该会更好用。