programacion - PHP-FPM no escribe en el registro de errores
php tutorial (9)
Acabo de instalar un servidor nginx + php-fpm. Todo parece correcto, excepto que PHP-FPM nunca escribe un error 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 una secuencia de comandos de PHP errónea y la ejecuté, y veo el resultado del error en el navegador web. También el registro de errores de nginx establece la salida de stderr de fpm con el mismo mensaje. Compruebo que el usuario tiene permiso de escritura (incluso he intentado 777) para la carpeta de registro designada. Incluso el archivo error.log designado ha sido creado con éxito por php-fpm. Sin embargo, el archivo de registro siempre está vacío, sin importar qué escandaloso error se haya cometido desde el script php.
¿Que esta pasando?
[Encontré el motivo bastante tiempo después]
Fue un permiso. Cambió el propietario a los usuarios de los sitios resuelto el problema.
Consulte el directorio 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/
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 para editar es el archivo que configura su grupo deseado. Por defecto es: /etc/php-fpm.d/www.conf
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). El arreglo prometido por el desarrollador se lanzará en la próxima versión. Si no desea esperar, use el parche en esa página y vuelva a compilar o revertir a 5.3.8.
Hay varios archivos de configuración 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.
Luché con esto durante mucho tiempo antes de encontrar mis registros de php-fpm escritos en /var/log/upstart/php5-fpm.log
. Parece ser un error entre la interacción entre advenedizo y php-fpm. Vea más aquí: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595
Recopilé 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 en /var/log/nginx/error.log
de manera predeterminada.
Puede surgir un problema si desea registrar una gran cantidad de datos (por ejemplo, una matriz) utilizando error_log(print_r($myArr, true));
. Si una matriz es lo suficientemente grande, parece que nginx
truncará su entrada de registro.
Para evitar esto, puede configurar fpm
( php.net fpm config ) para administrar los registros. Aquí están los pasos para hacerlo.
Abre
/etc/php5/fpm/pool.d/www.conf
:$ sudo nano /etc/php5/fpm/pool.d/www.conf
Descomente las dos líneas siguientes quitando
;
al comienzo 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
Crear
/var/log/fpm-php.www.log
:$ sudo touch /var/log/fpm-php.www.log;
Cambia la propiedad de
/var/log/fpm-php.www.log
para que php5-fpm pueda editarlo:$ sudo chown vagrant /var/log/fpm-php.www.log
Nota:
vagrant
es el usuario al que debo otorgarle la propiedad. Puede ver qué usuario debería ser para usted ejecutando$ ps aux | grep php.*www
$ ps aux | grep php.*www
y mirando la primera columna.Reiniciar php5-fpm:
$ sudo service php5-fpm restart
Ahora sus registros estarán en /var/log/fpm-php.www.log
.
Tuve un problema similar y tuve que hacer lo siguiente al archivo pool.d/www.conf
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 de hecho tuve que crearlo touch /var/log/fpm-php.www.log
luego estableciendo 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.
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 comenté esta línea
catch_workers_output = yes
Ahora puedo ver los registros en el archivo especificado por nginx.
en su archivo fpm.conf no ha configurado 2 variables que solo son para el registro de errores
estas variables son error_log (ruta del archivo de su archivo de registro de errores) log_level (nivel de registro de errores)
; Archivo de registro de errores; Nota: el prefijo predeterminado es / usr / local / php / var; Valor predeterminado: log / php-fpm.log
error_log = log/php-fpm.log
; Nivel de registro ; Valores posibles: alerta, error, advertencia, aviso, depuración; Valor predeterminado: aviso
log_level = notice