Re: upstream c keepalive и периодически 502 ошибка
Maxim Dounin
mdounin на mdounin.ru
Вт Окт 18 01:36:02 UTC 2016
Hello!
On Mon, Oct 17, 2016 at 07:42:31PM -0400, waster wrote:
> Доброго времени суток,
>
> Для раздачи HLS настроена схема из двух серверов cache-origin, где ts-чанки
> отдаются cache, а все запросы на m3u8-плейлисты проксируются на origin. На
> cache настроено проксирование с keepalive. Для примера приведу
> соотвествующие куски конфига cache:
>
> upstream hls01 {
> server X.X.X.X:80 fail_timeout=10 max_fails=3;
> keepalive 500;
> }
[...]
> В большинстве случаев все запросы к upstream обрабатываются быстро и без
> проблем, но в логах периодически появляется ошибка 502 "upstream prematurely
> closed connection while reading response header from upstream". Я включал
> логирование $upstream_status и видно, что в этот момент возвращается 502.
> Также снимал дамп трафика, в этот момент видно, что шлется RST-пакет. Эта
> проблема очень похожа на ту, которая описана тут:
> https://github.com/h2o/h2o/issues/281
>
> В чем может быть причина, и можно ли как-то избавиться от 502 на cache?
Соединение с бекендом, какое бы оно ни было постоянное,
периодически закрывается. Если это происходит в тот момент, когда
nginx послал в соединение запрос - с точки зрения nginx'а это
выглядит как ошибка.
Чтобы nginx имел возможность в такой ситуации перепослать запрос
ещё раз - стоит описать ещё один server в блоке upstream, можно
тот же самый. Тогда вместо возврата 502 клиенту nginx пойдёт на
следующий сервер в соответствии с настройкой proxy_next_upstream,
и вернёт пользователю полученный ответ.
> Для примера я также включал логирование различных времен ответов на запросы
> к upstream (request_time, upstream_response_time и др.) и в периоды большой
> нагрузки на cache, периодически наблюдаются задержки с ответами, т.е.
> upstream_connect_time, upstream_header_time, например от 1 до 5 сек. Хотя на
> origin трафик и нагрузка небольшие (см. выше). Пинг между origin и cache
> ~8ms.
Задержки в $upstream_connect_time - это скорее всего либо потери
пакетов, либо переполненная listen queue на бекенде (что на
Linux'е при настройках по умолчанию выглядит как потеря
SYN-пакета).
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru