nginx registra a saída stderr do php-fpm cortada em posições aparentemente aleatórias

2

Desde que comecei a usar uma biblioteca PHP que produz uma longa cadeia de chamadas, tem sido cada vez mais difícil depurar problemas causados por ela porque meus logs de erro acabam contendo uma saída como essa: (alguns valores foram apagados usando * )

2017/08/23 10:47:26 [error] 13057#13057: *206119 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught ActiveRecord\DatabaseException: PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for integer: "" in /var/www/********/vendor/php-activerecord/php-activerecord/lib/Connection.php:337
Stack trace:
#0 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Connection.php(337): PDOStatement->execute(Array)
#1 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Table.php(237): ActiveRecord\Connection->query('SELECT * FROM "...', Array)
#2 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Table.php(219): ActiveRecord\Table->find_by_sql('SELECT * FROM "...', Array, false, NULL)
#3 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Model.php(1666): ActiveRecord\Table->find(Array)
#4 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Model.php(1605): ActiveRecord\Model::find_by_pk('', Array)
#5 /var/www/********/includes/classes/Models/NSModel.php(11): ActiveRecord\Model::find(''" while reading response header from upstream, client: **.***.***.***, server: ***********, request: "POST /************************************ HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.1-fpm.sock:", host: "***********", referrer: "************************************************************"

Observe como na última linha a saída stderr FastCGI termina abruptamente após ActiveRecord\Model::find(''" . Outro exemplo:

2017/08/22 17:20:53 [error] 13057#13057: *193907 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught TypeError: Argument 1 passed to App\DeviantArt::isImageAvailable() must be of the type string, null given, called in /var/www/********/includes/classes/ImageProvider.php on line 138 and defined in /var/www/********/includes/classes/DeviantArt.php:357
Stack trace:
#0 /var/www/********/includes/classes/ImageProvider.php(138): App\DeviantArt::isImageAvailable(NULL)
#1 /var/www/********/includes/classes/ImageProvider.php(21): App\ImageProvider->setUrls('*******')
#2 /var/www/********/includes/classes/Posts.php(207): App\ImageProvider->__construct('******************', Array)
#3 /var/www/********/includes/classes/Controllers/PostController.php(334): App\Posts::checkRequestFinishingImage('***************...')
#4 /var/www/********/includes/classes/RouteHelper.php(11): App\Controllers\PostController->action(Array)
#5 /var/www/********/includes/do.php(27): App\RouteHelper::App\{closure}(Array)
#6 /var/www/********/www/index.php(1): require('/var/www/******...')
#7 {main}
  t" while reading response header from upstream, client: **.***.***.***, server: ***********, request: "POST /*************************** HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.1-fpm.sock:", host: "***********"

Aqui, a saída do stderr é cortada após o t , que deixa informações suficientes para encontrar o problema, mas ainda não é a mensagem completa. Não consigo encontrar nenhum padrão entre o comprimento da saída e quando ela é cortada.

Estou usando o nginx versão 1.10.3 e o PHP versão 7.1.8 no Debian Stretch. Também tentei configurar os seguintes valores em nginx.conf (porque procurei soluções para esse problema no passado), mas os exemplos acima foram produzidos com essas configurações já em vigor.

fastcgi_buffers 256 4k;
client_max_body_size 20M;
    
por SeinopSys 23.08.2017 / 11:37

1 resposta

-1

De acordo com as respostas encontradas em uma pergunta semelhante mesmo que eu tenha conseguido limitar os limites de caracteres do php-fpm, o nginx também truncar a saída, potencialmente resultando em perda de informação.

Para eliminar completamente esse risco, optei por usar o Monolog para lidar com o registro em nível de aplicativo, que pode ser usado com uma saída de arquivo para gravar mensagens de erro arbitrariamente longas e rastreamentos de pilha para. Esta questão pode ser útil para quem quer fazer o mesmo.

    
por 23.09.2017 / 13:47