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

2019-01-19 Пенетрантность S.A.N
> Я не слежу за разработкой 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

2019-01-18 Пенетрантность Maxim Dounin
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-01-18 Пенетрантность Vladislavik
Подтверждаю проблему в последних версиях 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

2014-02-20 Пенетрантность S.A.N
   Вы прислали 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

2014-02-18 Пенетрантность Maxim Dounin
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

2014-02-17 Пенетрантность Maxim Dounin
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

2014-02-17 Пенетрантность Валентин Бартенев
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