proxy_pass to variable and upstream server temporarily disabled variable

Sergey Kandaurov pluknet на nginx.com
Пт Май 24 15:26:38 UTC 2019


> On 24 May 2019, at 16:19, kron <nginx-forum на forum.nginx.org> wrote:
> 
> Доброго дня!
> 
> nginx: 1.15.8
> 
> Конфигурация простая (конечно она сильно шире, но в качестве бэкенда сейчас
> действительно один сервер задается через переменную):
> 
> split_clients "${remote_addr}${cookie_uid}" $backend {
>  * "backend1.eu-central-1.elb.amazonaws.com";
> }
> 
> 
> server {
>  listen 80;
> 
>  location / {
> 		proxy_pass http://$backend;
>  }
> }
> 
> Столкнулся с интересной проблемой. В один момент у меня перестали идти
> запросы на бэкенд, но быстро запросы восстановились. Поискал в логах, в
> итоге нашел такие ошибки:
> 
> 2019/05/24 08:40:26 [warn] 308#308: *1978088914 upstream server temporarily
> disabled while reading response header from upstream, client: x.x.x.x,
> server: xxxx, request: "GET / HTTP/1.1", upstream: "http://x.x.x.x:80/",
> host: "xxxx"
> 

Если апстрим с именем, в которое вычислилась переменная в proxy_pass
(как в примере выше), не описан явно или неявно, и потому используется
resolver (так это или нет - неясно из-за неполноты примера), то ошибка
возможна, если вычисленное имя порезолвилось в несколько адресов
и выбранный среди них сервер оказался неработоспособным.

> Честно говоря я предполагал такое поведение при исользовании группы
> серверов, но тут такого нет, а апстрим все-равно был забанен из-за ошибок.

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

-- 
Sergey Kandaurov



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