一 概述

lua-upstream 模块提供了对 upstrem 配置的查看,查看所有的 upstreamupstream 内所有的/启用的/备用的 server,当前使用的 upstream 名。虽然有 set_peer_down 指令,但是模块只修改单个 worker 内的 server 标记(处理 set_peer_down 请求的 worker),无法再生产环境使用

二 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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_upstreamset_upstreamstatus_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 的考虑,到时候应该会更好用。

四 链接