nginx stream module, dynamic upstream
Maxim Dounin
mdounin на mdounin.ru
Чт Янв 12 17:32:40 UTC 2023
Hello!
On Thu, Jan 12, 2023 at 04:37:40PM +0300, Sergey K wrote:
> В документации сказано, что можно использовать upstream с переменными
> (stream module).
>
> ----
> proxy_pass $upstream;
> В этом случае имя сервера ищется среди описанных групп серверов и если не
> найдено, то определяется с помощью resolver’а.
> ----
>
> Однако, в случае изменения айпи адреса для postgres.local nginx не видит
> изменений и продолжает обращаться к старому айпи адресу апстрима.
>
> nginx/1.18.0
>
> ----
> upstream postgres {
> server postgres.local:5432;
> }
>
> map stream $upstream {
> default postgres;
> }
>
> server {
> listen 5432;
>
> access_log /var/log/nginx/stream.access.log proxy buffer=32k
> flush=10s;
>
> proxy_pass $upstream;
> resolver 10.0.0.2 valid=30s;
> }
> ----
>
> похоже на баг либо я делаю что-то не верно?
У вас имя сервера, указанного в proxy_pass, ищется среди описанных
групп серверов, и оно найдено - в конфигурации есть upstream с
именем "postgres". Соответственно resolver не используется.
Что до имени сервера, указанного в группе серверов "postgres", а
именно "postgres.local", то это имя по общим правилам
преобразуется в IP-адреса при загрузке конфигурации.
Если хочется, чтобы nginx разнимался преобразованием имени в
IP-адреса при каждом обращении, то не надо описывать upstream, а
следует просто указать имя сервера с использованием переменных,
как-то так:
map stream $upstream { default "postgres.local:5432"; }
server {
...
proxy_pass $upstream;
resolver 10.0.0.2 valid=30s;
}
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru