PHP-FPM schreibt nicht in das Fehlerprotokoll

161

Ich habe gerade einen nginx + php-fpm Server installiert. Alles scheint in Ordnung zu sein, außer dass PHP-FPM niemals Fehler in sein Protokoll schreibt.

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;
  }
}

Ich habe ein fehlerhaftes PHP-Skript erstellt und ausgeführt und sehe die Fehlerausgabe im Webbrowser. Das Nginx-Fehlerprotokoll gibt auch die stderr-Ausgabe von fpm mit derselben Nachricht an. Ich habe überprüft, ob der Benutzer eine Schreibberechtigung (ich habe sogar 777 ausprobiert) für den festgelegten Protokollordner hat. Sogar die festgelegte error.log-Datei wurde erfolgreich von php-fpm erstellt. Die Protokolldatei ist jedoch immer leer, unabhängig davon, welcher unerhörte Fehler im PHP-Skript gemacht wurde.

Was ist los?

[Den Grund eine ganze Weile später gefunden]

Es war Erlaubnis. Der Eigentümer wurde auf die Benutzer der Websites geändert, um das Problem zu beheben.

eidng8
quelle
Es ist erwähnenswert, dass die problematische PHP-Version zwischen v5.3.9 und v5.3.14 liegt (wie heute). Es sollte ab Version 5.3.15 und Version 5.4.5 funktionieren.
Anton Babenko
Wenn Sie hhvm + php-fpm mit Homestead verwenden, befindet sich das Protokoll unter tail /var/log/hhvm/error.log
astroanu
Selbes Problem hier. Es scheint, dass der Zugriff und das langsame Protokoll unterschiedliche Berechtigungen benötigen, daher wird der Ordner mit root-755 erstellt.
Scones

Antworten:

190

Das hat bei mir funktioniert:

; 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

Bearbeiten:

Die zu bearbeitende Datei ist die Datei, die Ihren gewünschten Pool konfiguriert. Standardmäßig ist es: /etc/php-fpm.d/www.conf

Michaelbn
quelle
5
<strike> In welcher Konfigurationsdatei? php.ini? php-fpm.conf? </ strike>. Ich habe es in meinem/etc/php-fpm.d/www.conf
Swivel
16
Unter Ubuntu 14 befindet sich diese Datei unter /etc/php5/fpm/pool.d/www.conf
Gilberto Albino
2
Ich denke, die Frage ist dann, wo sich dieses schwer fassbare "Hauptfehlerprotokoll" befindet ... Oh, ich php_admin_value[error_log]verstehe , es ist der Wert in derselben Konfigurationsdatei - /var/log/php-fpm/www-error.log unter CentOS 7 , zB
Brad Peabody
7
sudo vi /etc/php/7.0/fpm/pool.d/www.conffür mich
Collin Anderson
Dies war der richtige Weg für mich, auf Debian 9.1 und PHP-FPM 7.0
Antwane
79

Ich hatte lange damit zu kämpfen, bevor ich herausfand, dass meine PHP-Fpm-Protokolle geschrieben wurden /var/log/upstart/php5-fpm.log. Es scheint ein Fehler zwischen der Interaktion von Upstart und PHP-Fpm zu sein. Weitere Informationen finden Sie hier: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

Code Commander
quelle
11
Vielen Dank!! Das war der Schlüssel für mich. Am Ende habe ich die beiden Dateien miteinander verknüpft, weil ich weiß, dass ich mich später nicht mehr daran erinnern werde:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair
PHP ist so verwirrend ... es gibt ein vorgefertigtes /var/log/php7.0-fpm.log, php_admin_value[error_log] = /var/log/fpm-php.www.logwird also auf nicht standardmäßiges Protokoll umgeleitet?
Peter Krauss
53

Ich hatte ein ähnliches Problem und musste Folgendes mit der pool.d/www.confDatei tun

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

Die Protokolldatei wurde immer noch nicht geschrieben, daher musste ich sie tatsächlich erstellen, indem ich touch /var/log/fpm-php.www.logden richtigen Eigentümer festlegte sudo chown www-data:www-data /var/log/fpm-php.www.log.

Sobald dies geschehen war und php5-fpm neu gestartet wurde, wurde die Protokollierung fortgesetzt.

Adnans
quelle
das war eigentlich der fall! Ich habe sogar einige weitere Inhalte direkt nach dem Fehler auf der Website veröffentlicht :)
Holms
Vielen Dank dafür! Dies war die Lösung für mich unter Ubuntu 14.04.1 (Jessie), wenn es jemand anderem hilft.
William Turrell
Ein Problem in einer vagabundierenden / debianischen Umgebung.
Xosofox
Andere Pfade wie / var / log / waren nur Zeitverschwendung.
Pedro Góes
1
Warum?! Dies ist immer noch ein Problem auf fpm-php7.
Benutzer1634074
31

Es gibt mehrere PHP-Konfigurationsdateien, aber DIESE müssen Sie bearbeiten:

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

Kommentieren Sie die Zeile aus, in der steht:

catch_workers_output

Dadurch können die PHPs stderr anstelle von / dev / null in das Fehlerprotokoll von php-fpm wechseln.

Vektor
quelle
2
Für diejenigen, die Docker verwenden, befinden sich Ihre Konfigurationsdateien:/usr/local/etc/php-fpm.d/
Edward
Wohin geht mit diesem conf das Protokoll, um /var/log/php7.0-fpm.log, um /var/log/fpm-php.www.logoder um?
Peter Krauss
Wo meldet es sich an?
Viktor Joras
26

Ich habe hier aus einer Reihe von Antworten Erkenntnisse gewonnen und präsentiere eine umfassende Lösung:

Wenn Sie also nginx mit php5-fpm einrichten und eine Nachricht mit protokollieren, error_log()können Sie diese /var/log/nginx/error.logstandardmäßig anzeigen .

Ein Problem kann auftreten, wenn Sie viele Daten (z. B. ein Array) mit protokollieren möchten error_log(print_r($myArr, true));. Wenn ein Array groß genug ist, nginxwird Ihr Protokolleintrag anscheinend abgeschnitten.

Um dies zu umgehen, können Sie fpm( php.net fpm config ) konfigurieren , um Protokolle zu verwalten. Hier sind die Schritte dazu.

  1. Öffnen /etc/php5/fpm/pool.d/www.conf:

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

  2. Kommentieren Sie die folgenden zwei Zeilen aus, indem Sie sie ;am Zeilenanfang entfernen : (error_log ist hier definiert: php.net )

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

  3. Erstellen /var/log/fpm-php.www.log:

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

  4. Ändern Sie den Besitz von, /var/log/fpm-php.www.logdamit php5-fpm ihn bearbeiten kann:

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

    Hinweis: vagrantist der Benutzer, dem ich das Eigentum geben muss. Sie können sehen, welcher Benutzer dies für Sie sein sollte, indem Sie die $ ps aux | grep php.*wwwerste Spalte ausführen und betrachten.

  5. Starten Sie php5-fpm neu:

    $ sudo service php5-fpm restart

Jetzt sind Ihre Protokolle in /var/log/fpm-php.www.log.

Gezim
quelle
Ich habe es versucht, immer noch ist "fpm-php.www.log" leer. Irgendeine Idee?
Sudharshan Nair
Drucken Sie Ihre aus phpinfo()und prüfen Sie, ob diese Einstellungen tatsächlich übernommen wurden, @SudharshanNair.
Gezim
@Gezim. Danke für deine Antwort. Mein Fehlerprotokollpfad ist /var/log/fpm-php.www.log. Noch ist diese Datei leer
Sudharshan Nair
@SudharshanNair, Wenn log_errorsFehler aktiviert sind, müssen Sie nur die Berechtigung und den Besitz der Datei überprüfen (Schritt 4).
Gezim
@Gezim. Ich habe 777 Berechtigungen und Besitz als gegeben www-data:www-data, immer noch kein Glück. Irgendeine Idee ?
Sudharshan Nair
14

Es gibt einen Fehler https://bugs.php.net/bug.php?id=61045 in php-fpm von v5.3.9 und bis jetzt (5.3.14 und 5.4.4). Der vom Entwickler versprochene Fix wird in der nächsten Version veröffentlicht. Wenn Sie nicht warten möchten, verwenden Sie den Patch auf dieser Seite und erstellen Sie ihn neu oder führen Sie einen Rollback auf 5.3.8 durch.

Drewx
quelle
4

In Ihrer Datei fpm.conf haben Sie keine 2 Variablen festgelegt, die nur für die Fehlerprotokollierung vorgesehen sind

Diese Variablen sind error_log (Dateipfad Ihrer Fehlerprotokolldatei) log_level (Fehlerprotokollierungsstufe)

;; Fehlerprotokolldatei; Hinweis: Das Standardpräfix lautet / usr / local / php / var. Standardwert: log / php-fpm.log

error_log = log/php-fpm.log

;; Protokollstufe; Mögliche Werte: Alarm, Fehler, Warnung, Hinweis, Debug; Standardwert: Hinweis

log_level = notice
Khizar Ansari
quelle
ist nicht die Standardeinstellung /usr/local/var/phpstatt /usr/local/php/var? nur spekulieren.
n611x007
2

In meinem Fall zeige ich, dass das Fehlerprotokoll zu /var/log/php-fpm/www-error.log ging . Deshalb habe ich diese Zeile in /etc/php-fpm.d/www.conf kommentiert

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

und wie oben gesagt habe ich diese Zeile auch auskommentiert

catch_workers_output = yes

Jetzt kann ich Protokolle in der von nginx angegebenen Datei sehen.

enRaiser
quelle
0

Ich möchte den vorhandenen Antworten einen weiteren Tipp hinzufügen, da sie mein Problem nicht gelöst haben.

Achten Sie auf die folgende Nginx-Direktive in Ihrem PHP-Standortblock:

fastcgi_intercept_errors on;

Das Entfernen dieser Linie hat viele Stunden des Kämpfens und Ziehens an den Haaren beendet.

Es könnte in einem enthaltenen conf-Verzeichnis wie /etc/nginx/default.d/php.confin meinem Fedora versteckt sein .

Arsylum
quelle
0

In meinem Fall gibt php-fpm 500 Fehler ohne Protokollierung aus, da das php-mysql-Modul fehlt. Ich habe die Joomla-Installation auf einen anderen Server verschoben und vergessen. Also apt-get install php-mysqlund Service Neustart löste es.

Ich begann mit dem Versuch, fehlerhafte Protokollierung ohne Erfolg zu beheben. Schließlich stracefand ich nach db-bezogenen Systemaufrufen eine Fehlermeldung. Obwohl mein Fall nicht direkt mit der Frage von op zusammenhängt, hoffe ich, dass er nützlich sein könnte.

user3132194
quelle
-3

Überprüfen Sie das Eigentümerverzeichnis von "PHP-FPM"

Du kannst tun:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
Kalkulator
quelle
5
Setzen Sie / var / log / php-fpm niemals auf 777, Sie haben Ihren Server nur für einen Symlink-Angriff anfällig gemacht (wenn nicht schlimmer)
Luca Gibelli