Как nginx закрывает коннект с бэкэндом?

AleXXX V. NovikoFF alexxx at alexxx.ru
Tue Mar 28 21:52:19 MSD 2006


Tue, 28 Mar 2006 21:34:43 +0600
"AleXXX V. NovikoFF" <alexxx at alexxx.ru> писал(а):

> 
> Tue, 28 Mar 2006 18:26:04 +0400 (MSD)
> Igor Sysoev <is at rambler-co.ru> писал(а):
> 
> > On Tue, 28 Mar 2006, AleXXX V. NovikoFF wrote:
> > 
> > > Tue, 28 Mar 2006 17:20:49 +0400 (MSD)
> > > Igor Sysoev <is at rambler-co.ru> писал(а):
> > >
> > >> On Tue, 28 Mar 2006, AleXXX V. NovikoFF wrote:
> > >>
> > >>> Mon, 27 Mar 2006 23:41:56 +0500
> > >>> "AleXXX V. NovikoFF" <alexxx at alexxx.ru> писал(а):
> > >>>
> > >>>> Добрый день!
> > >>>>
> > >>>> Возникла проблема, на бэкэнде есть скрипт выполняющийся с опцией
> > >>>> ignore_user_abort = true;
> > >>>> когда он просто болтался на апаче, он работал до конца, даже если юзер
> > >>>> нажимал в броузере "Стоп" ну или просто связь рвалась, или таймаут
> > >>>> наступал...
> > >>>> Тот же скрипт висит на бэкэнде через nginx - он перестал выполняться до
> > >>>> конца, при одном из условий он просто прибивается... :(
> > >>>>
> > >>>> Как бы такого избежать?
> > >>>>
> > >>>> Скрипт ничего не выводит, просто через какое-то время делает HTTP/1.0
> > >>>> 302 Moved и Location.
> > >>>> Пробовал выводить что-то - тоже самое.
> > >>>> Вот так прицеплен к нему прокси:
> > >>>>
> > >>>>         location ^~ /script/ {
> > >>>>             proxy_pass   http://127.0.0.1;
> > >>>>
> > >>>>             proxy_connect_timeout       300;
> > >>>>             proxy_send_timeout          300;
> > >>>>             proxy_read_timeout          300;
> > >>>>
> > >>>>             proxy_buffer_size          1k;
> > >>>>             proxy_buffers              4 32k;
> > >>>>             proxy_temp_file_write_size 256k;
> > >>>>
> > >>>>             proxy_set_header    Host             $host;
> > >>>>             proxy_set_header    X-Real-IP        $remote_addr;
> > >>>>         }
> > >>>>
> > >>>>
> > >>>> Может я чего-то не так делаю?
> > >>>>
> > >>>
> > >>> и тишина, и мертвые с косами.... :-)
> > >>
> > >> Если клиент закрыл соединение, то nginx тоже закрывает соединение с бэкендом.
> > >> Это легко сделать настраиваемым, нужно только придумать название директиве
> > >>
> > >> proxy_ignore_client_abort  on|off  ?
> > >>
> > >
> > > вполне бы подошло....но все же сомнение.... т.е. при потере связи с
> > > клиентом nginx закрывает соединение с бэкэндом нормальным способом, что
> > > тот думает, что соединение завершилось нормально, так чтоли?
> > 
> > Да, nginx просто закрывает соединение.
> > 
> 
> тогда такая опция бы пригодилась, в идеале с настройкой для location

> ну и все-таки таймаут чтобы на нее действовал, 
> какой нить из этих:
> 
> > >>>>             proxy_send_timeout          300;
> > >>>>             proxy_read_timeout          300;
> 
> ну или свой какой-то...
> а то мало ли что там случилось, повесится так куча таких висяков...

хотя нет, таймаут не нужен, он есть внутри скрипта

кстати вот такой еще пример:

на бэкэнде скрипт на пхп:

<?
set_time_limit(40);
ignore_user_abort(true);
sleep(31);
mail("alexxx at alexxx.ru", "test", date("d-m-Y H:i:s"));
?>

таймаут у nginx прокси стоит 300 сек
однако вижу баг(?): через секунд 10 выдает ошибку 502
email не приходит, ибо скрипт прибивается (вот тлько не должен бы!)
10 секунд у меня send_timeout

Когда заставляю скрипт сперва вывести *много* текста в броузер (видимо
размер буфера прокси) - то текст выводится и все срабатывает...


-- 
AleXXX V. NovikoFF <alexxx at alexxx.ru>






More information about the nginx-ru mailing list