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