Re: fastcgi keep conn on и fastcgi finish request() в PHP
> Я не слежу за разработкой PHP, но если вы по прежнему наблюдаете > проблему - можно предположить, что баг в PHP так и не поправили, и > fastcgi_finish_request() пользоваться не стоит. Да, у нас это была одна из причин, уйти от FPM, и перейти на Swoole https://www.swoole.co.uk/docs/ Потом на самописный наш app server В FPM более 100 багов которым 2-5 лет, FPM не развивается и там уже ищут нового мейтейнера https://externals.io/message/101893 Posted at Nginx Forum: https://forum.nginx.org/read.php?21,247596,282751#msg-282751 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
Hello! On Fri, Jan 18, 2019 at 01:12:08PM -0500, Vladislavik wrote: > Подтверждаю проблему в последних версиях 2019 года присутствует. > При включенных fastcgi_keep_conn и keepalive, если скрипт завершился через > fastcgi_finish_request() и продолжает выполнять работу в фоне, то следующий > запрос другого клиента к php-fpm может получить 502 ошибку, придя по тому же > коннекту, уже судя по всему не сможет подключиться к php-fpm, тк тот все еще > выполняет прошлую задачу. Вопрос, почему запрос пихается на не завершенный > процесс. Когда я на это смотрел в последний раз, php не умел корректно работать с keepalive-соединениями при использовании fastcgi_finish_request(), и посылал FCGI_END_REQUEST два раза - один раз после вызова fastcgi_finish_request(), второй раз после завершения работы в фоне. Вторая отправка FCGI_END_REQUEST ожидаемо приводила к 502, если к тому моменту nginx успевал отправить в соединение очередной запрос. Подробнее тут: http://mailman.nginx.org/pipermail/nginx-devel/2014-July/005539.html Я не слежу за разработкой PHP, но если вы по прежнему наблюдаете проблему - можно предположить, что баг в PHP так и не поправили, и fastcgi_finish_request() пользоваться не стоит. -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
Подтверждаю проблему в последних версиях 2019 года присутствует. При включенных fastcgi_keep_conn и keepalive, если скрипт завершился через fastcgi_finish_request() и продолжает выполнять работу в фоне, то следующий запрос другого клиента к php-fpm может получить 502 ошибку, придя по тому же коннекту, уже судя по всему не сможет подключиться к php-fpm, тк тот все еще выполняет прошлую задачу. Вопрос, почему запрос пихается на не завершенный процесс. Posted at Nginx Forum: https://forum.nginx.org/read.php?21,247596,282747#msg-282747 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
Вы прислали FCGI_END_REQUEST, ничего не вернув клиенту, о чём nginx и плачет. Единственное, что он в данном случае может сделать - это вернуть клиенту ошибку. Это происходит только при выключенном fastcgi_keep_conn и keepalive, если их выключить Nginx отлично отдает 200 статус без ошибок. ENOPARSE. Я не правильно сформулировал ответ, имелось виду что ошибка 502 появляется не из-за пустого ответа бекенда, ответ может быть не пустым но ошибка все равно будет 502, причина только одна повторное использования конекта в котором не завершенная фоновая работа РНР скрипта. Если отключить fastcgi_keep_conn и keepalive, РНР скрипт (из примера выше) работает без ошибок. Судя по всему проблема в PHP-FPM сложно сказать баг это или особенность его работы, к сожалению в PHP-FPM документации это не описано. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,247596,247821#msg-247821 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
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 mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
Hello! On Sat, Feb 15, 2014 at 03:36:18PM -0500, S.A.N wrote: При включенном keepalive в upstream к FastCGI бекенду на PHP, появляются ошибки 502, проблему нашли и воспроизводится она таким образом. РНР скрипт, медленные операции выполняет в фон режиме после вызова функции fastcgi_finish_request(), тестовый скрипт ?php ignore_user_abort(); fastcgi_finish_request(); sleep(10); ? конфигурация Nginx upstream fpm { server 127.0.0.1:9000; keepalive 8; } server { .. fastcgi_keep_conn on; fastcgi_param SCRIPT_NAME /index.php; fastcgi_pass fpm; .. } Лог ошибки Nginx [error] 7945#0: *5 upstream sent unexpected FastCGI record: 3 while reading response header from upstream ... Вы прислали FCGI_END_REQUEST, ничего не вернув клиенту, о чём nginx и плачет. Единственное, что он в данном случае может сделать - это вернуть клиенту ошибку. Лог ошибок PHP-FPM пустой. Ожидаемо, т.к. со стороны php поведение - ровно то, которое запросил программист. В 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), вы уже не сможете ничего вернуть клиенту. Так имеет смысл делать, когда вы хотите вернуть ответ, а потом сделать ещё какую-то работу. Мультиплексировать так несколько запросов в одном процессе php - не получится. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: fastcgi keep conn on и fastcgi finish request() в PHP
On Monday 17 February 2014 13:21:03 S.A.N wrote: [..] Если я правильно понял, использовать keepalive конекта после FCGI_END_REQUEST, не выйдет? И есть только два варианта, отказаться от keepalive (без него эта схема работает) или отказаться от fastcgi_finish_request (без него работает keepalive) Есть только один правильный вариант реализации выполнения тяжелых запросов: складывать их в очередь, которую затем разгребать отдельным процессом. От того, что вы позвали fastcgi_finish_request() - у вас самый главный ресурс, PHP-процесс не освободился и обрабатывать другие запросы он по-прежнему не в состоянии. -- Валентин Бартенев ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru