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