PHP-FPM не записывает в журнал ошибок
Я только что установил сервер nginx + php-fpm. Все кажется прекрасным, за исключением того, что PHP-FPM никогда не записывает ошибку в свой журнал.
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 скриптs 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;
}
}
Я сделал ошибочный php script и запустил, и посмотрел вывод ошибок в веб-браузере. Также журнал ошибок nginx устанавливает вывод stderr из fpm с тем же сообщением. Я проверяю, что пользователь имеет право на запись (я даже попробовал 777) на назначенную папку журнала. Даже указанный файл error.log был успешно создан php-fpm. Однако файл журнала всегда пуст, независимо от того, какая возмутительная ошибка была сделана с помощью PHP скрипт.
Что происходит?
[Нашел причину спустя некоторое время]
Это было разрешение. Пользователь изменил владельца на сайты, которые решили проблему.
Ответы
Ответ 1
Это сработало для меня:
; 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
Edit:
Файл для редактирования - это файл, который настраивает нужный пул.
По умолчанию его:/etc/php-fpm.d/www.conf
Ответ 2
Я долгое время боролся с этим, прежде чем обнаруживать, что мои журналы php-fpm записывались в /var/log/upstart/php5-fpm.log
. Кажется, это ошибка между тем, как взаимодействуют upstart и php-fpm. Подробнее здесь: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595
Ответ 3
У меня была аналогичная проблема, и мне пришлось сделать следующее в pool.d/www.conf
файле
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
Он все еще не писал файл журнала, поэтому мне действительно нужно было создать его touch /var/log/fpm-php.www.log
, а затем установить правильного владельца sudo chown www-data.www-data /var/log/fpm-php.www.log
.
Как только это было сделано, и перезапущен php5-fpm, возобновление ведения журнала возобновилось.
Ответ 4
Существует несколько конфигурационных файлов php, но это тот, который вам нужно изменить:
/etc/php(version)?/fpm/pool.d/www.conf
раскомментируйте строку, в которой говорится:
catch_workers_output
Это позволит PHP stderr перейти в журнал ошибок php-fpm вместо/dev/null.
Ответ 5
Я собрал идеи из кучи ответов здесь, и я представляю комплексное решение:
Итак, если вы настроили nginx с php5-fpm и зарегистрируете сообщение с помощью error_log()
, вы можете увидеть его в /var/log/nginx/error.log
по умолчанию.
Проблема может возникнуть, если вы хотите записать много данных (например, массив) с помощью error_log(print_r($myArr, true));
. Если массив достаточно велик, кажется, что nginx
обрезает вашу запись в журнале.
Чтобы обойти это, вы можете настроить fpm
на управление журналами. Вот шаги для этого.
-
Откройте /etc/php5/fpm/pool.d/www.conf
:
$ sudo nano /etc/php5/fpm/pool.d/www.conf
-
Раскомментируйте следующие две строки, удалив ;
в начале строки:
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
-
Создать /var/log/fpm-php.www.log
:
$ sudo touch /var/log/fpm-php.www.log;
-
Измените право собственности на /var/log/fpm-php.www.log
, чтобы php5-fpm мог его отредактировать:
$ sudo chown vagrant /var/log/fpm-php.www.log
Примечание. vagrant
- это пользователь, которому я должен предоставить право собственности. Вы можете видеть, какой пользователь должен быть для вас, запустив $ ps aux | grep php.*www
и посмотрев первый столбец.
-
Перезапустите php5-fpm:
$ sudo service php5-fpm restart
Теперь ваши журналы будут в /var/log/fpm-php.www.log
.
Ответ 6
В php-fpm из v5.3.9 и до сих пор существует ошибка https://bugs.php.net/bug.php?id=61045 (5.3.14 и 5.4.4). Разработчик обещал, что исправление пойдет вживую в следующей версии. Если вы не хотите ждать - используйте патч на этой странице и перестройте или откатите до 5.3.8.
Ответ 7
в вашем файле fpm.conf вы не установили 2 переменную, которая предназначена только для регистрации ошибок
эти переменные являются error_log (путь к файлу вашего файла журнала ошибок) log_level (уровень регистрации ошибок)
; Файл журнала ошибок
; Примечание: префикс по умолчанию:/usr/local/php/var
; Значение по умолчанию: log/php-fpm.log
error_log = log/php-fpm.log
; Уровень журнала
; Возможные значения: предупреждение, ошибка, предупреждение, уведомление, отладка
; Значение по умолчанию: уведомление
log_level = notice
Ответ 8
в моем случае я показываю, что журнал ошибок собирался /var/log/php -fpm/www-error.log. поэтому я прокомментировал эту строку в файле /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
и, как было сказано выше, я также раскоментировал эту строку
catch_workers_output = yes
Теперь я могу видеть журналы в файле, указанном nginx.
Ответ 9
Проверьте каталог "PHP-FPM" владельца
Вы можете сделать:
ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/