Re: Проблемы с proxy connect timeout

Maxim Dounin mdounin на mdounin.ru
Вт Авг 8 15:43:09 UTC 2017


Hello!

On Tue, Aug 08, 2017 at 11:13:43AM -0400, d.sibilkov wrote:

> >Модули ngx_stream_proxy_module и ngx_http_proxy_module - это два 
> >совершенно разных модуля, и каждый имеет свои собственные 
> >конфигурационные директивы.
> 
> Как мне тогда понять какой proxy_connect_timeout я использую и в чем
> разница?

Модуль ngx_stream_proxy_module работает исключительно в блоке 
stream{}, и работает с произвольными соединениями.  Модуль 
ngx_http_proxy_module - в блоке http{}, и имеет дело с 
http-запросами в рамках модуля http.

Разница в том, что это два совершенно разных модуля, и в общем 
случае одинаковые директивы могут иметь совершенно разный смысл.  
Но, конечно, мы стараемся делать так, чтобы похожие директивы вели 
себя одинаково, и для proxy_connect_timeout это справедливо.

> >Для начала стоит разобраться в том, почему "упавший" бекенд 
> >продолжает принимать соединения. И сделать так, чтобы не 
> >продолжал. 
> 
> Он и не продолжает, просто сервер висит с открытым портом, если Вы
> зателнетитесь на любой открытый порт он соединение установит но данные
> никакие ходить не будут т.к. порт никто не слушает - сервис который должен
> слушать порт лежит. 

В том, что бекенд упал, а порт остался открытым - и есть проблема.  
В норме listen-сокет автоматически закрывается, если приложение, 
его открывшее, падает.  И это позволяет детектировать падение 
бекенда на этапе установления соединения.

Вероятно, первопричина проблемы в том, что вы пытаетесь 
использовать systemd.  Который, в свою очередь, падение бекенда 
увидеть не даёт.  Так жить можно, но только в отсутствии нагрузки, 
и когда ожидание таймауту на чтение - это нормально.  Если же 
такое поведение начинает доставлять проблемы, то решений тут 
возможно два:

- выкинуть systemd, чтобы он не скрывал от nginx'а, что происходит 
  с реальным бекендом;

- решать проблему в рамках systemd, и искать в нём соответствующий 
  таймаут.

> >Ну и очевидно, что если у вас бекенды падают, и детектирование 
> >упавшего бекенда знимает 60 секунд, уменьшать fail_timeout до 5 
> >секунд несколько, как бы это сказать, расточительно. Наоборот, 
> >стоит поднять до каких-либо сравнимых значений.
> 
> Так вот мне и нужно чтобы это занимало не 60с (которые срабатывают по
> proxy_read_timeout) а как можно меньше.
> Я судя по всему чего-то не понимаю или мы просто о разных вещах говорим..

Чтобы детектирование проблемы занимало меньше времени, нужно 
либо лечить бекенды (см. выше), либо уменьшать proxy_read_timeout.  
Других вариантов, по большому счёту, нет.

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

-- 
Maxim Dounin
http://nginx.org/


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