proxy_pass to variable and upstream server temporarily disabled variable

Maxim Dounin mdounin на mdounin.ru
Вт Июн 4 15:34:16 UTC 2019


Hello!

On Tue, Jun 04, 2019 at 10:40:23AM -0400, kron wrote:

> > В случае если адрес сервера в proxy_pass с переменными определяется
> > с помощью resolver'а, то на каждый запрос создаётся новый апстрим.
> > Это может быть не так e.g. в случае алиасинга с неявным апстримом;
> > я бы проверил это в первую очередь. 
> 
> Да, в моем случае в переменной DNS адрес, который резолвится с помощью
> резолвера и адрес точно резолвится в несколько адресов.
> Таким образом получается, что при каждом запросе создается новый upstream с
> адресом в который разрезолвилась переменная и пока этот адрес есть в
> резолвере, каждый новый запрос будет фейлить?

Не совсем так.  Если у вас один из N возвращаемых из DNS бэкендов 
нерабочий - то при исползовании переменных с вероятностью 1/N 
nginx попытается сначала отправить запрос именно на него, и 
получит ошибку.  После чего пойдёт на другой бэкенд в соответствии 
с proxy_next_upstream.

> Кажется крутым решением было бы брать набор адресов из резолвера и из них
> уже делать апстрим с дефолтным фоллбэком. Хотя вероятно делать это на каждый
> запрос было бы ресурсоемко.

Если хочется, чтобы полученный набор серверов использовался не 
только для одного запроса - это можно сделать, описав блок 
upstream и/или написав в конфиге proxy_pass без переменных.  Так, 
собственно, nginx работает по умолчанию.

Если же хочется, чтобы полученный набор адресов периодечески 
обновлялся - то такая фича есть в платной версии, подробности тут:

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

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


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