Re: Динамический upstream средствами dns в открытой версии nginx

Maxim Dounin mdounin на mdounin.ru
Вт Мар 19 15:44:31 UTC 2019


Hello!

On Tue, Mar 19, 2019 at 06:30:34PM +0300, Иван wrote:

> Есть необходимость выбирать апстрим для проксирования на основании
> информации из mysql-базы. Есть мысль задействовать для этого DNS-сервер
> с поддержкой mysql в бэкэнде (и A\AAAA записи с небольшим, порядка 30-60
> секунд TTL), например, powerdns и nginx примерно в такой конфигурации:
> 
> Пусть DNS отвечает на 127.0.1.1:53 . У него бэкэнд в мускуле, в котором
> сотни A\AAAA записей вида
> 
> user1.room1.example.com -> 1.1.1.1
> 
> user2.room1.example.com -> 1.10.1.2
> 
> user3.room2.example.com -> 1.200.1.100
> 
> и т.п.
> 
> которые (записи) периодически (раз в несколько часов) обновляет наше ПО.
> 
> 
> В nginx на прокси примерно такая конфигурация:
> 
> location ~ ^/user/(?<room>\w+)/(?<user>\w+)$ {
> 
>     resolver 127.0.1.1;
> 
>     proxy_pass http://$user.$room.example.com;
> 
> }
> 
> Будет ли в такой конфигурации запрос вида GET /user/room2/user3 к прокси
> уходить на 1.200.1.100, а GET /user/room1/user2 к прокси уходить на
> 1.10.1.2,

Будет.

> Когда я последний раз думал над этой схемой, мне казалось, что тут
> что-то доступно только в коммерческой подписке.

В коммерческой подписке из сколько-нибудь имеющего отношения к 
резолвингу имён - параметр resolve у директивы server в блоке 
upstream[1].  Но он не про то, что вам нужно, а про то, чтобы одно 
и то же имя сервера в блоке upstream периодически обновлять в 
соответствии с текущим состояние DNS.

Простой резолвинг имён, заданных переменными, есть в nginx начиная 
с 0.6.18, и коммерческой подписки не требует.

[1] http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#resolve

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru