PHP-FPM non scrive nel registro degli errori


161

Ho appena installato un server nginx + php-fpm. Tutto sembra a posto, tranne che PHP-FPM non scrive mai errori nel suo registro.

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

Ho creato ed eseguito uno script php errato e ho visualizzato l'output dell'errore sul browser Web. Anche il log degli errori nginx indica l'output stderr da fpm con lo stesso messaggio. Ho verificato che l'utente disponga dell'autorizzazione di scrittura (ho anche provato 777) nella cartella di registro designata. Anche il file error.log nominato è stato creato con successo da php-fpm. Tuttavia, il file di registro è sempre vuoto, indipendentemente dall'errore oltraggioso fatto dallo script php.

Cosa sta succedendo?

[Ho trovato il motivo un po 'più tardi]

Era permesso. Il problema è stato modificato dal proprietario agli utenti dei siti.


Vale la pena ricordare che la versione problematica di php è compresa tra v5.3.9 e v5.3.14 (come oggi). Dovrebbe funzionare a partire da v5.3.15 e v5.4.5.
Anton Babenko,

se stai usando hhvm + php-fpm con la fattoria il registro è in coda /var/log/hhvm/error.log
astroanu

Lo stesso problema qui. Sembra che l'accesso e il registro lento richiedano autorizzazioni diverse, quindi la cartella viene creata con root-755.
focaccine

Risposte:


190

Questo ha funzionato per me:

; 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

Modificare:

Il file da modificare è il file che configura il pool desiderato. Di default è: /etc/php-fpm.d/www.conf


5
<strike> In quale file di configurazione? php.ini? php-fpm.conf? </ strike>. L'ho decommentato all'interno del mio/etc/php-fpm.d/www.conf
Swivel

16
Su Ubuntu 14 questo file si trova in /etc/php5/fpm/pool.d/www.conf
Gilberto Albino il

2
Immagino che la domanda sia dove si trova questo sfuggente "registro degli errori principali" ... Oh, vedo, è il valore di php_admin_value[error_log]nello stesso file di configurazione - /var/log/php-fpm/www-error.log su CentOS 7 , ad es
Brad Peabody,

7
sudo vi /etc/php/7.0/fpm/pool.d/www.confper me
Collin Anderson,

Questo è stato il modo giusto per me, su Debian 9.1 e PHP-FPM 7.0
Antwane,

79

Ho lottato con questo per molto tempo prima di trovare i miei registri php-fpm su cui venivano scritti /var/log/upstart/php5-fpm.log. Sembra essere un bug tra come interagiscono upstart e php-fpm. Scopri di più qui: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595


11
Grazie!! Questa è stata la chiave per me. Ho finito il collegamento simbolico dei due file perché so che non me lo ricorderò più tardi:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair,

PHP è così confuso ... ce ne sono un pre-creato /var/log/php7.0-fpm.logcosì, php_admin_value[error_log] = /var/log/fpm-php.www.logreindirizzerà al registro non standard ??
Peter Krauss,

53

Ho avuto un problema simile e ho dovuto fare quanto segue al pool.d/www.conffile

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

Non stava ancora scrivendo il file di registro, quindi ho dovuto crearlo touch /var/log/fpm-php.www.logimpostando il proprietario corretto sudo chown www-data:www-data /var/log/fpm-php.www.log.

Fatto ciò, e riavviato php5-fpm, la registrazione è stata ripresa.


quello era in realtà il caso! Ho anche avuto qualche altro contenuto apparso sul sito subito dopo l'errore :)
holms

Grazie mille per questo! Questa è stata la soluzione per me su Ubuntu 14.04.1 (Jessie), se aiuta qualcun altro.
William Turrell,

Qualche problema in un ambiente sibilante vagabondo / debian.
Xosofox

Altri percorsi, come / var / log /, dove solo una perdita di tempo.
Pedro Góes,

1
Perché?! Questo è ancora un problema su fpm-php7.
user1634074

31

Esistono più file di configurazione php, ma QUESTO è quello che devi modificare:

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

decommenta la riga che dice:

catch_workers_output

Ciò consentirà a PHP stderr di accedere al registro degli errori di php-fpm invece di / dev / null.


2
Per coloro che usano la finestra mobile i tuoi file di configurazione si trovano:/usr/local/etc/php-fpm.d/
Edward

Con questo conf, dove va il log, at /var/log/php7.0-fpm.log, at /var/log/fpm-php.www.logo altro?
Peter Krauss,

Dove accede?
Viktor Joras,

26

Ho raccolto approfondimenti da una serie di risposte qui e presento una soluzione completa:

Pertanto, se si configura nginx con php5-fpm e si registra un messaggio utilizzando, error_log()è possibile visualizzarlo /var/log/nginx/error.logper impostazione predefinita.

Un problema può sorgere se si desidera registrare molti dati (ad esempio un array) utilizzando error_log(print_r($myArr, true));. Se un array è abbastanza grande, sembra che nginxtroncerà la voce di registro.

Per ovviare a questo è possibile configurare fpm( php.net fpm config ) per gestire i log. Ecco i passaggi per farlo.

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

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

  2. Rimuovi il commento dalle due righe seguenti rimuovendo ;all'inizio della riga: (error_log è definito qui: php.net )

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

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

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

  4. Cambia la proprietà in /var/log/fpm-php.www.logmodo che php5-fpm possa modificarlo:

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

    Nota: vagrantè l'utente a cui devo dare la proprietà. Puoi vedere quale utente dovrebbe essere per te eseguendo $ ps aux | grep php.*wwwe guardando la prima colonna.

  5. Riavvia php5-fpm:

    $ sudo service php5-fpm restart

Ora i tuoi log saranno in /var/log/fpm-php.www.log.


Ho provato questo, ancora "fpm-php.www.log" è vuoto. Qualche idea?
Sudharshan Nair,

Stampa la tua phpinfo()e vedi se queste impostazioni sono state effettivamente rilevate, @SudharshanNair.
Gezim,

@Gezim. grazie per la tua risposta. il mio percorso del registro errori è /var/log/fpm-php.www.log. Questo file è ancora vuoto
Sudharshan Nair,

@SudharshanNair, Se gli log_errorserrori vengono attivati, l'unica altra cosa da verificare è l'autorizzazione e la proprietà del file (passaggio 4).
Gezim,

@Gezim. Ho dato 777 autorizzazioni e proprietà come www-data:www-data, Ancora nessuna fortuna. Qualche idea ?
Sudharshan Nair,

14

C'è un bug https://bugs.php.net/bug.php?id=61045 in php-fpm dalla v5.3.9 e fino ad ora (5.3.14 e 5.4.4). La correzione promessa dallo sviluppatore sarà pubblicata nella prossima versione. Se non si desidera attendere, utilizzare la patch in quella pagina e ricostruire o ripristinare la versione 5.3.8.


4

Nel tuo file fpm.conf non hai impostato 2 variabili che sono solo per la registrazione degli errori.

Le variabili sono error_log(percorso del file di registro degli errori) e log_level(livello di registrazione degli errori).

; 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

non è l'impostazione predefinita /usr/local/var/phpinvece di /usr/local/php/var? solo speculazioni.
n611x007

2

nel mio caso mostro che il registro degli errori andava in /var/log/php-fpm/www-error.log . così ho commentato questa riga in /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

e come detto sopra ho anche decommentato questa riga

catch_workers_output = yes

Ora posso vedere i registri nel file specificato da nginx.


0

Vorrei aggiungere un altro suggerimento alle risposte esistenti perché non hanno risolto il mio problema.

Fai attenzione alla seguente direttiva nginx nel tuo blocco posizione php:

fastcgi_intercept_errors on;

La rimozione di questa linea ha posto fine a molte ore di lotta e di stiramento dei capelli.

Potrebbe essere nascosto in una directory conf inclusa come /etc/nginx/default.d/php.confnella mia fedora.


-1

Nel mio caso php-fpm genera 500 errori senza alcuna registrazione a causa della mancanza del modulo php-mysql. Ho spostato l'installazione di Joomla su un altro server e me ne sono dimenticato. Quindi il apt-get install php-mysqlriavvio del servizio lo ha risolto.

Ho iniziato con il tentativo di correggere la registrazione interrotta senza successo. Alla fine straceho trovato un messaggio di errore dopo le chiamate di sistema relative al db. Sebbene il mio caso non sia direttamente correlato alla domanda dell'op, spero che possa essere utile.


-4

Controlla la directory del proprietario di "PHP-FPM"

Tu puoi fare:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/

5
mai impostato / var / log / php-fpm su 777, hai appena reso il tuo server vulnerabile a un attacco symlink (se non peggio)
Luca Gibelli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.