nginx (openresty) 获取当前 Peer

在若干个容器应用实例前有一个openresty负载均衡器,负载均衡器会使用轮询(round robbin)将流量路由到每个应用实例。 有没有一种方法可以将配对的后端服务器IP地址记录到redis中?上游是固定的,但是动态的。

我尝试使用上游,但似乎只能与固定的上游 {} 配合使用,无法与动态上游配合使用。

docker-compose up --scale nginx_html_app=2
-- 这是docker-compose.yml文件
nginx_html_app:
    build: nginx_html_app
proxy:
    build: proxy
    ports:
        - "9000:80"

-- 这是proxy.conf文件
server{
    listen 80;
    set $upstream http://nginx_html_app
    location / {
        some_lua_block{
            # 获取配对的后端IP地址,例如:172.18.0.3(nginx_html_app 1)
            # 保存到redis中(知道如何做)
        }
        proxy_pass $upstream
    }
}
点赞
用户369550
用户369550

header_filter_by_lualog_by_lua 中可以通过 ngx.var.upstream_addr 变量获取上游 IP 和端口号。但是在第一种情况下,记录日志将使请求等待写入完成,在第二种情况下网络套接字不可用,因此您需要将日志记录排队,并在计时器中触发它。

类似于以下内容(未经测试,但应该可以帮助您了解):

app.lua - 分离的文件,需要这样做以便全局状态将被缓存:

M = {}

local queue = {}

function M.init()
  ngx.timer.every(1.0, function(premature)
    if premature then return end
    -- 将队列推送到 Redis 并清除它
  end)
end

function M.log()
  queue[#queue+1] = ngx.var.upstream_addr
end

return M

nginx:

init_worker_by_lua_block { require('app.lua').init() }

log_by_lua_block { -- 或者 header_filter_by_lua_block
  require('app.lua').log()
}
2020-04-07 23:46:00