Re: fastcgi keep conn on и fastcgi finish request() в PHP

Maxim Dounin mdounin at mdounin.ru
Tue Feb 18 12:32:41 UTC 2014


Hello!

On Mon, Feb 17, 2014 at 01:21:03PM -0500, S.A.N wrote:

> > > Лог ошибки Nginx
> > > [error] 7945#0: *5 upstream sent unexpected FastCGI record: 3 while
> > reading
> > > response header from upstream ...
> > 
> > Вы прислали FCGI_END_REQUEST, ничего не вернув клиенту, о чём 
> > nginx и плачет.  Единственное, что он в данном случае может 
> > сделать - это вернуть клиенту ошибку.
> 
> Это происходит только при выключенном fastcgi_keep_conn и keepalive, если их
> выключить Nginx отлично отдает 200 статус без ошибок.

ENOPARSE.

> > > В upstreem кеше 8 конектов, ошибка появляется когда Nginx ждет от
> > PHP-FPM
> > > ответа в конекте который ещё не освободился, по моей логике PHP-FPM
> > должен
> > > ответить Nginx когда скрипт завершит работу (sleep(10)) но этого не
> > > происходит и Nginx отдает 502 ошибку, судя по всему PHP-FPM после
> > > освобождения конекта не смог обработать следующий запрос от Nginx в
> > этом
> > > конекте, подозреваю что функции fastcgi_finish_request() не
> > рассчитана на
> > > повторное использования конекта.
> > > 
> > > Или я что-то делаю не правильно?
> > 
> > После того, как запрос завершён с помощью FCGI_END_REQUEST (== 
> > fastcgi_finish_request() в php), вы уже не сможете ничего вернуть 
> > клиенту.
> > 
> > Так имеет смысл делать, когда вы хотите вернуть ответ, а потом 
> > сделать ещё какую-то работу.  
> 
> Да именно так все и задумано, но Nginx отдает 502 ошибку.

В том примере кода, что был приведён - ответ никто не возвращает, 
так что ошибка ожидаема.

> >Мультиплексировать так несколько запросов в одном процессе php - не
> получится.
> 
> Если я правильно понял, использовать keepalive конекта после
> FCGI_END_REQUEST, не выйдет? 
> И есть только два варианта, отказаться от keepalive (без него эта схема
> работает) или отказаться от fastcgi_finish_request (без него работает
> keepalive)

При правильной работы со стороны php - ничего непоправимого 
происходить не должно.  Скорее всего - будет некоторое время 
тормозить следующий запрос в соответствующем соединении (ну и 
может отвалится по таймауту, если работа после предыдущего запрос 
продолжается долго).

Что у вас на самом деле происходит - надо смотреть на реальном 
коде, и с каким-то более разумным debug'ом.  Ну и да, если проблема 
действительно есть, а не является следствием неправильного 
php-кода - то скорее всего она в php.

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



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