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