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