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_lua
和 log_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()
}
在容器应用的几个实例前面有一个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_lua
和 log_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()
}