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

161

Je viens d'installer un serveur nginx + php-fpm. Tout semble bien 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 créé un script php erroné et exécuté, et j'ai vu la sortie d'erreur sur le navigateur Web. Le journal des erreurs nginx indique également la sortie stderr de fpm avec le même message. J'ai vérifié que l'utilisateur a l'autorisation d'écrire (j'ai même essayé 777) sur le dossier de journal désigné. Même le fichier error.log nommé a été créé avec succès par php-fpm. Cependant, le fichier journal est toujours vide, quelle que soit l'erreur scandaleuse commise à partir du script php.

Que se passe-t-il?

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

C'était la permission. Le changement de propriétaire des utilisateurs des sites a résolu le problème.

eidng8
la source
Il convient de mentionner que la version php problématique se situe entre la v5.3.9 et la v5.3.14 (comme aujourd'hui). Cela devrait fonctionner à partir de la v5.3.15 et de la v5.4.5.
Anton Babenko
si vous utilisez hhvm + php-fpm avec homestead, le journal est à tail /var/log/hhvm/error.log
astroanu
Même problème ici. Il semble que l'accès et le journal lent nécessitent des autorisations différentes, le dossier est donc créé avec root-755.
scones

Réponses:

190

Cela a fonctionné 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

Éditer:

Le fichier à modifier est le fichier qui configure votre pool souhaité. Par défaut c'est: /etc/php-fpm.d/www.conf

Michaelbn
la source
5
<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
Swivel
16
Sur Ubuntu 14, ce fichier se trouve à /etc/php5/fpm/pool.d/www.conf
Gilberto Albino
2
Je suppose que la question est alors de savoir où se trouve ce "journal des erreurs principal" insaisissable ... 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
Brad Peabody
7
sudo vi /etc/php/7.0/fpm/pool.d/www.confpour moi
Collin Anderson
C'était la bonne façon pour moi, sur Debian 9.1 et PHP-FPM 7.0
Antwane
79

J'ai lutté avec cela pendant longtemps avant de trouver que mes journaux php-fpm étaient écrits /var/log/upstart/php5-fpm.log. Cela semble être un bogue entre l'interaction entre upstart et php-fpm. Pour en savoir plus: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

Commandant du code
la source
11
Merci!! C'était la clé pour moi. J'ai fini par lier les deux fichiers parce que je sais que je ne vais pas m'en souvenir plus tard:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair
PHP est tellement confus ... il y a un pré-créé /var/log/php7.0-fpm.logdonc, php_admin_value[error_log] = /var/log/fpm-php.www.logredirigera vers un journal non standard ??
Peter Krauss
53

J'ai eu un problème similaire et j'ai dû faire ce qui suit pour le 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 touch /var/log/fpm-php.www.logdéfinissant le bon propriétaire sudo chown www-data:www-data /var/log/fpm-php.www.log.

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

adnans
la source
c'était effectivement le cas! J'ai même eu du contenu supplémentaire sur le site juste après l'erreur :)
holms
Merci beaucoup pour cela! C'était la solution pour moi sur Ubuntu 14.04.1 (Jessie), si cela aide quelqu'un d'autre.
William Turrell
Un problème dans un environnement sifflant vagabond / debian.
Xosofox
D'autres chemins, tels que / var / log /, ne sont qu'une perte de temps.
Pedro Góes du
1
Pourquoi?! C'est toujours un problème sur fpm-php7.
user1634074
31

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 à PHP stderr d'accéder au journal des erreurs de php-fpm au lieu de / dev / null.

vecteur
la source
2
Pour ceux qui utilisent le docker, vos fichiers de configuration se trouvent:/usr/local/etc/php-fpm.d/
Edward
Avec cette conf, où va le journal, à /var/log/php7.0-fpm.log, à /var/log/fpm-php.www.logou autre?
Peter Krauss
Où se connecte-t-il?
Viktor Joras
26

J'ai rassemblé des idées à partir d'un tas de réponses ici et je présente une solution complète:

Donc, si vous configurez nginx avec php5-fpm et enregistrez un message en utilisant, error_log()vous pouvez le voir /var/log/nginx/error.logpar défaut.

Un problème peut survenir si vous souhaitez enregistrer un grand nombre de données (par exemple un tableau) en utilisant error_log(print_r($myArr, true));. Si un tableau est suffisamment grand, il semble que nginxcela tronquera votre entrée de journal.

Pour contourner ce problème, vous pouvez configurer fpm( php.net fpm config ) pour gérer les journaux. Voici les étapes pour le faire.

  1. Ouvert /etc/php5/fpm/pool.d/www.conf:

    $ sudo nano /etc/php5/fpm/pool.d/www.conf

  2. Décommentez les deux lignes suivantes en supprimant ;au début de la ligne: (error_log est défini ici: php.net )

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

  3. Créer /var/log/fpm-php.www.log:

    $ sudo touch /var/log/fpm-php.www.log;

  4. Changez la propriété de /var/log/fpm-php.www.logafin que php5-fpm puisse le modifier:

    $ sudo chown vagrant /var/log/fpm-php.www.log

    Remarque: vagrantest l'utilisateur auquel je dois donner la propriété. Vous pouvez voir quel utilisateur cela devrait être pour vous en exécutant $ ps aux | grep php.*wwwet en regardant la première colonne.

  5. Redémarrez php5-fpm:

    $ sudo service php5-fpm restart

Maintenant, vos journaux seront enregistrés /var/log/fpm-php.www.log.

Gezim
la source
J'ai essayé ceci, toujours "fpm-php.www.log" est vide. Une idée?
Sudharshan Nair
Imprimez votre phpinfo()et voyez si ces paramètres ont effectivement été repris, @SudharshanNair.
Gezim
@Gezim. Merci pour votre réponse. mon chemin d'accès au journal des erreurs est /var/log/fpm-php.www.log. Ce fichier est toujours vide
Sudharshan Nair
@SudharshanNair, Si les log_errorserreurs sont activées, la seule autre chose à vérifier est l'autorisation et la propriété du fichier (étape 4).
Gezim
@Gezim. J'ai donné 777 autorisations et propriété comme www-data:www-data, toujours pas de chance. Une idée ?
Sudharshan Nair
14

Il y a un bug https://bugs.php.net/bug.php?id=61045 dans php-fpm à partir de la v5.3.9 et jusqu'à maintenant (5.3.14 et 5.4.4). Le correctif promis par le développeur sera mis en ligne dans la prochaine version. Si vous ne voulez pas attendre, utilisez le correctif sur cette page et reconstruisez ou revenez à 5.3.8.

Drewx
la source
4

Dans votre fichier fpm.conf, vous n'avez pas défini 2 variables qui sont uniquement destinées à la journalisation des erreurs.

Les variables sont error_log(chemin du fichier 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
khizar ansari
la source
n'est pas la valeur par défaut /usr/local/var/phpau lieu de /usr/local/php/var? juste spéculer.
n611x007
2

dans mon cas, je montre que le journal des erreurs allait à /var/log/php-fpm/www-error.log . j'ai donc commenté cette ligne dans /etc/php-fpm.d/www.conf

php_flag[display_errors]   is commented
php_flag[display_errors] = on  log will be at /var/log/php-fpm/www-error.log

et comme dit ci-dessus, j'ai également décommenté cette ligne

catch_workers_output = yes

Maintenant, je peux voir les journaux dans le fichier spécifié par nginx.

enRaiser
la source
0

Je voudrais ajouter une autre astuce aux réponses existantes car elles n'ont pas résolu mon problème.

Faites attention à la directive nginx suivante dans votre bloc d'emplacement php:

fastcgi_intercept_errors on;

La suppression de cette ligne a mis fin à de nombreuses heures de lutte et d'arrachage de cheveux.

Il pourrait être caché dans un répertoire conf inclus comme /etc/nginx/default.d/php.confdans mon fedora.

Arsylum
la source
-1

Dans mon cas, php-fpm génère 500 erreurs sans aucune journalisation en raison du module php-mysql manquant. J'ai déplacé l'installation de joomla vers un autre serveur et je l'ai oublié. Donc, apt-get install php-mysqlet le redémarrage du service l'a résolu.

J'ai commencé par essayer de réparer la journalisation interrompue sans succès. Enfin, stracej'ai trouvé un message d'échec après des appels système liés à la base de données. Bien que mon cas ne soit pas directement lié à la question d'Op, j'espère que cela pourrait être utile.

user3132194
la source
-4

Vérifiez le répertoire propriétaire de "PHP-FPM"

Tu peux faire:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
kalculateur
la source
5
jamais défini / var / log / php-fpm sur 777, vous venez de rendre votre serveur vulnérable à une attaque de lien symbolique (sinon pire)
Luca Gibelli