PHP-FPM no escribe en el registro de errores

161

Acabo de instalar un servidor nginx + php-fpm. Todo parece estar bien, excepto que PHP-FPM nunca escribe errores en su 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;
  }
}

Hice un script php erróneo y ejecuté, y veo la salida de error en el navegador web. También el registro de errores de nginx indica la salida stderr de fpm con el mismo mensaje. Verifiqué que el usuario tenga permiso de escritura (incluso he intentado 777) para la carpeta de registro designada. Incluso el archivo designado error.log ha sido creado con éxito por php-fpm. Sin embargo, el archivo de registro siempre está vacío, no importa qué error escandaloso se haya hecho desde el script php.

¿Que esta pasando?

[Encontró la razón bastante tiempo después]

Fue permiso. Cambió el propietario a los usuarios de los sitios resuelto el problema.

eidng8
fuente
Vale la pena mencionar que la versión problemática de php está entre v5.3.9 y v5.3.14 (como en la actualidad). Debería funcionar a partir de v5.3.15 y v5.4.5.
Anton Babenko
si está utilizando hhvm + php-fpm con homestead, el registro se encuentra en tail /var/log/hhvm/error.log
astroanu el
El mismo problema aqui. Parece que el acceso y el registro lento necesitan diferentes permisos, por lo tanto, la carpeta se crea con root-755.
bollos

Respuestas:

190

Esto funcionó para mí:

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

El archivo a editar es el archivo que configura su grupo deseado. Por defecto es: /etc/php-fpm.d/www.conf

michaelbn
fuente
55
<strike> ¿En qué archivo de configuración? php.ini? php-fpm.conf? </strike>. Lo descomenté dentro de mi/etc/php-fpm.d/www.conf
Giratorio
16
En Ubuntu 14, este archivo se encuentra en /etc/php5/fpm/pool.d/www.conf
Gilberto Albino
2
Supongo que la pregunta es dónde está este escurridizo "registro de errores principales" ... Oh, ya veo, es el valor de php_admin_value[error_log]ese mismo archivo de configuración - /var/log/php-fpm/www-error.log en CentOS 7 por ejemplo
Brad Peabody el
77
sudo vi /etc/php/7.0/fpm/pool.d/www.confpara mí
Collin Anderson
Esta fue la forma correcta para mí, en Debian 9.1 y PHP-FPM 7.0
Antwane
79

Luché con esto durante mucho tiempo antes de encontrar que mis registros de php-fpm estaban siendo escritos /var/log/upstart/php5-fpm.log. Parece ser un error entre cómo interactúan el advenedizo y php-fpm. Ver más aquí: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

Code Commander
fuente
11
¡¡Gracias!! Esta fue la clave para mí. Terminé simpatizando los dos archivos porque sé que no voy a recordar esto más tarde:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair
PHP es tan confuso ... hay un pre-creado /var/log/php7.0-fpm.log, php_admin_value[error_log] = /var/log/fpm-php.www.log¿redirigirá a un registro no estándar?
Peter Krauss
53

Tuve un problema similar y tuve que hacer lo siguiente al pool.d/www.confarchivo

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

Todavía no estaba escribiendo el archivo de registro, así que tuve que crearlo touch /var/log/fpm-php.www.logconfigurando el propietario correcto sudo chown www-data:www-data /var/log/fpm-php.www.log.

Una vez hecho esto, y se reinició php5-fpm, se reanudó el registro.

adnans
fuente
ese fue realmente el caso! Incluso obtuve contenido adicional apareció en el sitio justo después del error :)
holms
¡Muchas gracias por esto! Esta fue la solución para mí en Ubuntu 14.04.1 (Jessie), si ayuda a alguien más.
William Turrell
Algún problema en un entorno vagabundo / debian wheezy.
Xosofox
Otras rutas, como / var / log /, donde solo es una pérdida de tiempo.
Pedro Góes
1
¡¿Por qué?! Esto sigue siendo un problema en fpm-php7.
user1634074
31

Hay varios archivos de configuración de php, pero ESTE es el que necesita editar:

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

descomenta la línea que dice:

catch_workers_output

Eso permitirá que PHP stderr vaya al registro de errores de php-fpm en lugar de / dev / null.

vector
fuente
2
Para aquellos que usan Docker, sus archivos de configuración se encuentran:/usr/local/etc/php-fpm.d/
Edward
Con esta configuración, ¿a dónde va el registro, en /var/log/php7.0-fpm.log, en /var/log/fpm-php.www.logu otro?
Peter Krauss
¿A dónde se conecta?
Viktor Joras
26

Reuní ideas de un montón de respuestas aquí y presento una solución integral:

Entonces, si configura nginx con php5-fpm y registra un mensaje usando error_log(), puede verlo de manera /var/log/nginx/error.logpredeterminada.

Puede surgir un problema si desea registrar una gran cantidad de datos (digamos una matriz) usando error_log(print_r($myArr, true));. Si una matriz es lo suficientemente grande, parece que nginxtruncará su entrada de registro.

Para evitar esto, puede configurar fpm( php.net fpm config ) para administrar registros. Aquí están los pasos para hacerlo.

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

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

  2. Elimine el comentario de las dos líneas siguientes eliminando ;al principio de la línea: (error_log se define aquí: php.net )

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

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

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

  4. Cambie la propiedad de /var/log/fpm-php.www.logpara que php5-fpm pueda editarlo:

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

    Nota: vagrantes el usuario al que debo otorgar la propiedad. Puede ver qué usuario debería ser para usted ejecutando $ ps aux | grep php.*wwwy mirando la primera columna.

  5. Reinicie php5-fpm:

    $ sudo service php5-fpm restart

Ahora tus registros estarán adentro /var/log/fpm-php.www.log.

Gezim
fuente
Intenté esto, Aún así "fpm-php.www.log" está vacío. ¿Alguna idea?
Sudharshan Nair
Imprima su phpinfo()y vea si estas configuraciones realmente se recogieron, @SudharshanNair.
Gezim
@Gezim. gracias por su respuesta. mi ruta de registro de error es /var/log/fpm-php.www.log. Todavía este archivo está vacío
Sudharshan Nair
@SudharshanNair, si los log_errorserrores están activados, lo único que se debe verificar es el permiso y la propiedad del archivo (paso 4).
Gezim
@Gezim. He otorgado 777 permisos y propiedad como www-data:www-data, todavía no tuve suerte. Alguna idea ?
Sudharshan Nair
14

Hay un error https://bugs.php.net/bug.php?id=61045 en php-fpm desde v5.3.9 y hasta ahora (5.3.14 y 5.4.4). La solución prometida por el desarrollador se lanzará en la próxima versión. Si no quiere esperar, use el parche en esa página y vuelva a compilar o revierta a 5.3.8.

Drewx
fuente
4

En su archivo fpm.conf no ha configurado 2 variables que son solo para el registro de errores.

Las variables son error_log(ruta del archivo de registro de errores) y log_level(nivel de registro de errores).

; 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
fuente
no es el predeterminado en /usr/local/var/phplugar de /usr/local/php/var? solo especulando.
n611x007
2

en mi caso muestro que el registro de errores iba a /var/log/php-fpm/www-error.log . así que comenté esta línea en /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

y como dije anteriormente, también descomenté esta línea

catch_workers_output = yes

Ahora puedo ver registros en el archivo especificado por nginx.

enRaiser
fuente
0

Me gustaría agregar otro consejo a las respuestas existentes porque no resolvieron mi problema.

Tenga cuidado con la siguiente directiva nginx en su bloque de ubicación php:

fastcgi_intercept_errors on;

Eliminar esta línea ha puesto fin a muchas horas de lucha y tirones del cabello.

Podría estar oculto en algún directorio conf incluido, como /etc/nginx/default.d/php.confen mi fedora.

Arsylum
fuente
-1

En mi caso, php-fpm genera un error de 500 sin ningún registro debido a la falta del módulo php-mysql. Moví la instalación de Joomla a otro servidor y lo olvidé. Entonces, apt-get install php-mysqly el reinicio del servicio lo resolvió.

Comencé tratando de arreglar el registro roto sin éxito. Finalmente, straceencontré un mensaje de error después de las llamadas al sistema relacionadas con db. Aunque mi caso no está directamente relacionado con la pregunta de op, espero que pueda ser útil.

usuario3132194
fuente
-4

Consulte el directorio del propietario de "PHP-FPM"

Tu puedes hacer:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
kalculator
fuente
55
nunca configuró / var / log / php-fpm en 777, acaba de hacer que su servidor sea vulnerable a un ataque de enlace simbólico (si no peor)
Luca Gibelli