nginx (openresty) 获取当前节点

nginx (openresty) get current peer

在容器应用的几个实例前面有一个openresty负载均衡器,负载均衡器将使用round robbin将流量路由到每个应用实例。 有没有办法将配对的后端服务器IP地址记录到redis中?上游是固定的,是动态的。

我尝试使用上游,但它似乎只适用于固定的上游 {},而不是动态的

docker-compose up --scale nginx_html_app=2
-- this is docker-compose.yml
nginx_html_app:
    build: nginx_html_app
proxy:
    build: proxy
    ports:
        - "9000:80"

-- this is proxy.conf
server{
    listen 80;
    set $upstream http://nginx_html_app
    location / {
        some_lua_block{
            # get paired backend IP, eg: 172.18.0.3 (nginx_html_app 1)
            # save to redis (know how to do this)
        }
        proxy_pass $upstream
    }
}

上游 IP 和端口在 ngx.var.upstream_addr 变量、header_filter_by_lualog_by_lua 中可用。但是首先登录会使请求等待您的写入完成,而在第二个位置,网络套接字不可用,因此您需要对日志进行排队并在计时器中触发它。

类似的东西(未经测试但应该可以帮助您理解):

app.lua - 单独的文件,我们需要它以便缓存全局状态:

M = {}

local queue = {}

function M.init()
  ngx.timer.every(1.0, function(premature)
    if premature then return end
    -- push queue to redis and clear it
  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 { -- or header_filter_by_lua_block
  require('app.lua').log()
}