nginx (опенресты) получить текущий сверстник - PullRequest
0 голосов
/ 26 марта 2020

есть балансировщик нагрузки openresty перед несколькими экземплярами приложения контейнера, балансировщик нагрузки будет использовать round robbin для маршрутизации трафика c каждому экземпляру приложения. Есть ли способ записать IP-адрес парного внутреннего сервера в redis? восходящий канал зафиксирован, это динамический c.

Я пытался использовать восходящий, но, похоже, работает только с фиксированным восходящим {}, а не динамический c один

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
    }
}

1 Ответ

0 голосов
/ 08 апреля 2020

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()
}
...