169 votes

PHP-FPM n'écrit pas dans le journal des erreurs

Je viens d'installer un serveur nginx+php-fpm. Tout semble correct sauf que PHP-FPM n'écrit jamais d'erreur dans son journal.

fpm.conf

[default]
listen = /var/run/php-fpm/default.sock
listen.allowed_clients = 127.0.0.1
listen.owner = webusr
listen.group = webusr
listen.mode = 0666
user = webusr
group = webusr
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /php/fpm/status
ping.path = /php/fpm/ping
request_terminate_timeout = 30s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/default/slow.log
chroot = /var/www/sites/webusr
catch_workers_output = yes
env[HOSTNAME] = mapsvr.mapking.com
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/default/error.log
php_admin_flag[log_errors] = on

nginx.conf

server
{
  listen        80 default_server;
  server_name   _;

  charset       utf-8;
  access_log    /var/log/nginx/access.log rest;

  include       conf.d/drops.conf.inc;

  location      /
  {
    root        /var/www/sites/webusr/htdocs;
    index       index.html index.htm index.php;
  }

  # pass the PHP scripts to FastCGI server listening on socket
  #
  location      ~ \.php$
  {
    root           /var/www/sites/webusr/htdocs;
    include        /etc/nginx/fastcgi_params;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /htdocs/$fastcgi_script_name;
    if (-f $request_filename)
    {
      fastcgi_pass   unix:/var/run/php-fpm/default.sock;
    }
  }

  location      = /php/fpm/status
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  location      = /php/fpm/ping
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  # redirect server error pages to the static page /50x.html
  #
  error_page    500 502 503 504  /50x.html;
  location      = /50x.html
  {
    root        /usr/share/nginx/html;
  }
}

J'ai fait un php script erroné et exécuté, et voir la sortie d'erreur sur le navigateur Web. Le journal des erreurs de nginx indique également la sortie stderr de fpm avec le même message. J'ai vérifié que l'utilisateur a le droit d'écrire (j'ai même essayé 777) dans le dossier de journal désigné. Même le fichier error.log a été créé avec succès par php-fpm. Cependant, le fichier journal est toujours vide, quelle que soit l'erreur scandaleuse qui a été faite à partir de php script.

Qu'est-ce qui se passe ?

[J'ai trouvé la raison un peu plus tard]

C'était une permission. Changer le propriétaire en utilisateurs du site a résolu le problème.

0 votes

Il convient de mentionner que la version problématique de php se situe entre v5.3.9 et v5.3.14 (à ce jour). Il devrait fonctionner à partir des versions 5.3.15 et 5.4.5.

0 votes

Si vous utilisez hhvm + php-fpm avec homestead le journal est à tail /var/log/hhvm/error.log

0 votes

Même problème ici. Il semble que les journaux d'accès et de ralentissement aient besoin de permissions différentes, donc le dossier est créé avec Root-755.

205voto

michaelbn Points 1388

Cela a marché pour moi :

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
catch_workers_output = yes

Editar:

Le fichier à modifier est le fichier qui configure le pool que vous souhaitez. Par défaut, il s'agit de /etc/php-fpm.d/www.conf

5 votes

<strike>Dans quel fichier de configuration ? php.ini ? php-fpm.conf?</strike>. Je l'ai décommenté dans mon /etc/php-fpm.d/www.conf

16 votes

Sur Ubuntu 14, ce fichier est situé dans /etc/php5/fpm/pool.d/www.conf

2 votes

Je suppose que la question est de savoir où se trouve cet insaisissable "journal principal des erreurs"... Oh, je vois, c'est la valeur de php_admin_value[error_log] dans ce même fichier de configuration - /var/log/php-fpm/www-error.log sur CentOS 7, par exemple.

59voto

adnans Points 561

J'ai eu un problème similaire et j'ai dû faire ce qui suit à l'adresse suivante pool.d/www.conf fichier

php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

Il n'écrivait toujours pas le fichier journal, j'ai donc dû le créer en utilisant la méthode suivante touch /var/log/fpm-php.www.log puis définir le propriétaire correct sudo chown www-data:www-data /var/log/fpm-php.www.log .

Une fois que cela a été fait, et que php5-fpm a été redémarré, la journalisation a repris.

0 votes

C'était en fait le cas ! J'ai même obtenu que du contenu supplémentaire apparaisse sur le site juste après l'erreur :)

0 votes

Merci beaucoup pour cela ! C'était la solution pour moi sur Ubuntu 14.04.1 (Jessie), si cela peut aider quelqu'un d'autre.

0 votes

Un problème dans un environnement vagrant/debian wheezy.

33voto

vector Points 119

Il existe plusieurs fichiers de configuration php, mais c'est celui que vous devez modifier :

/etc/php(version)?/fpm/pool.d/www.conf

décommentez la ligne qui dit :

catch_workers_output

Cela permettra à PHPs stderr d'aller dans le journal d'erreur de php-fpm au lieu de /dev/null.

5 votes

Pour ceux qui utilisent Docker, vos fichiers de configuration sont situés : /usr/local/etc/php-fpm.d/

0 votes

Avec cette conf, où va le journal, à /var/log/php7.0-fpm.log à /var/log/fpm-php.www.log ou autre ?

0 votes

Où se trouve-t-il ?

15voto

Drewx Points 131

Il y a un bug https://bugs.php.net/bug.php?id=61045 dans php-fpm à partir de la version 5.3.9 et jusqu'à présent (5.3.14 et 5.4.4). Le développeur a promis que le correctif serait mis en ligne dans la prochaine version. Si vous ne voulez pas attendre - utilisez le patch sur cette page et recompilez ou revenez à la version 5.3.8.

6voto

khizar ansari Points 530

Dans votre fichier fpm.conf, vous n'avez pas défini deux variables qui servent uniquement à la journalisation des erreurs.

Les variables sont error_log (chemin d'accès de votre fichier journal des erreurs) et log_level (niveau de journalisation des erreurs).

; Error log file
; Note: the default prefix is /usr/local/php/var
; Default Value: log/php-fpm.log

error_log = log/php-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice

log_level = notice

0 votes

N'est pas la valeur par défaut /usr/local/var/php au lieu de /usr/local/php/var ? juste des spéculations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X