PHP-FPM не записывает в журнал ошибок


161

Я только что установил сервер 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 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;
  }
}

Я сделал ошибочный скрипт php и запустил, и вижу вывод ошибок в веб-браузере. Также журнал ошибок nginx сообщает о выводе stderr из fpm с тем же сообщением. Я проверил, что у пользователя есть разрешение на запись (я даже пробовал 777) в назначенную папку журнала. Даже назначенный файл error.log был успешно создан php-fpm. Тем не менее, файл журнала всегда пуст, независимо от того, какая вопиющая ошибка была допущена в скрипте php.

В чем дело?

[Нашел причину довольно долго позже]

Это было разрешение. Сменил владельца, чтобы пользователи сайта решили проблему.


Стоит отметить, что проблемная версия php находится между v5.3.9 и v5.3.14 (как на сегодняшний день). Это должно работать, начиная с v5.3.15 и v5.4.5.
Антон Бабенко

если вы используете hhvm + php-fpm с усадьбой, журнал находится в хвосте /var/log/hhvm/error.log
astroanu

Та же проблема здесь. Похоже, что доступ и медленный журнал требуют разных разрешений, поэтому папка создается с root-755.
булочки

Ответы:


190

Это сработало для меня:

; 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

Редактировать:

Файл для редактирования - это файл, который настраивает желаемый пул. По умолчанию это: /etc/php-fpm.d/www.conf


5
<strike> В каком конфигурационном файле? php.ini? PHP-fpm.conf? </ Забастовка>. Я раскомментировал это внутри моего/etc/php-fpm.d/www.conf
Swivel

16
В Ubuntu 14 этот файл находится по адресу /etc/php5/fpm/pool.d/www.conf
Гилберто Альбино

2
Наверное, вопрос в том, где находится этот неуловимый «основной журнал ошибок» ... О, я вижу, это значение того php_admin_value[error_log]же файла конфигурации - /var/log/php-fpm/www-error.log в CentOS 7 , например
Brad Peabody

7
sudo vi /etc/php/7.0/fpm/pool.d/www.confдля меня
Коллин Андерсон

Это был правильный путь для меня, на Debian 9.1 и PHP-FPM 7,0
Antwane

79

Я долго боролся с этим, прежде чем обнаружил, что мои логи php-fpm записываются /var/log/upstart/php5-fpm.log. Кажется, это ошибка между взаимодействием upstart и php-fpm. Смотрите больше здесь: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595


11
Спасибо!! Это был ключ для меня. Я закончил тем, что сделал символическую ссылку на эти два файла, потому что я знаю, что не запомню это позже:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair

PHP это так запутано ... есть заранее, /var/log/php7.0-fpm.logтак что, php_admin_value[error_log] = /var/log/fpm-php.www.logбудете перенаправлять в нестандартный журнал ??
Питер Краусс

53

У меня была похожая проблема, и мне пришлось сделать следующее в 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 перезапустился, регистрация была возобновлена.


это было на самом деле так! Я даже получил какой-то дополнительный контент, появившийся на сайте сразу после ошибки :)
holms

Большое спасибо за это! Это было решением для меня в Ubuntu 14.04.1 (Джесси), если это поможет кому-то еще.
Уильям Туррелл,

Некоторая проблема в среде vagrant / debian wheezy.
Xosofox

Другие пути, такие как / var / log /, где просто трата времени.
Педро Гоес

1
Зачем?! Это все еще проблема на fpm-php7.
user1634074

31

Существует несколько конфигурационных файлов php, но это тот, который вам нужно отредактировать:

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

раскомментируйте строку, которая говорит:

catch_workers_output

Это позволит PHPs stderr перейти в журнал ошибок php-fpm вместо / dev / null.


2
Для тех, кто использует докер, ваши конфигурационные файлы находятся:/usr/local/etc/php-fpm.d/
Edward

С этим conf, куда идет журнал, в /var/log/php7.0-fpm.log, в /var/log/fpm-php.www.logили другом?
Питер Краусс

Куда он входит?
Виктор Жорас

26

Я собрал идеи из множества ответов здесь и представляю комплексное решение:

Итак, если вы настроили nginx с php5-fpm и зарегистрировали сообщение, используя его, error_log()вы можете увидеть его /var/log/nginx/error.logпо умолчанию.

Проблема может возникнуть, если вы хотите регистрировать много данных (скажем, массив), используя error_log(print_r($myArr, true));. Если массив достаточно велик, похоже, что nginxбудет обрезана ваша запись в журнале.

Чтобы обойти это, вы можете настроить fpm( php.net fpm config ) для управления журналами. Вот шаги, чтобы сделать это.

  1. Открыть /etc/php5/fpm/pool.d/www.conf:

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

  2. Раскомментируйте следующие две строки, удалив ;в начале строки: (здесь определен error_log: php.net )

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

  3. Создать /var/log/fpm-php.www.log:

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

  4. Измените владельца /var/log/fpm-php.www.logтак, чтобы php5-fpm мог его редактировать:

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

    Примечание: vagrantпользователь, которому я должен передать право собственности. Вы можете увидеть, каким пользователем это должно быть для вас, запустив $ ps aux | grep php.*wwwи посмотрев на первый столбец.

  5. Перезапустите php5-fpm:

    $ sudo service php5-fpm restart

Теперь ваши логи будут в /var/log/fpm-php.www.log.


Я попробовал это, все еще "fpm-php.www.log" пуст. Любая идея?
Судхаршан Наир

Распечатайте свой файл phpinfo()и посмотрите, действительно ли эти настройки были выбраны, @SudharshanNair.
Гезим

@Gezim. Спасибо за ваш ответ. мой путь журнал ошибок /var/log/fpm-php.www.log. Тем не менее этот файл пуст
Судхаршан Наир

@SudharshanNair, если включены log_errorsошибки, единственное, что нужно проверить - это разрешение и владение файлом (шаг 4).
Гезим

@Gezim. Я дал 777 разрешений и прав собственности как www-data:www-data, Все еще не повезло. Любая идея ?
Судхаршан Наир

14

Существует ошибка https://bugs.php.net/bug.php?id=61045 в php-fpm с версии 5.3.9 и до настоящего времени (5.3.14 и 5.4.4). Разработчик обещал, что исправление выйдет в свет в следующем выпуске. Если вы не хотите ждать - используйте патч на этой странице и перестройте или откатитесь до 5.3.8.


4

В вашем файле fpm.conf вы не установили 2 переменные, которые предназначены только для регистрации ошибок.

Переменные error_log(путь к файлу журнала ошибок) и log_level(уровень регистрации ошибок).

; 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

не по умолчанию /usr/local/var/phpвместо /usr/local/php/var? просто размышлять.
n611x007

2

в моем случае я показываю, что журнал ошибок собирался в /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.


0

Я хотел бы добавить еще один совет к существующим ответам, потому что они не решили мою проблему.

Не упустите следующую директиву nginx в вашем блоке местоположения php:

fastcgi_intercept_errors on;

Удаление этой линии положило конец многим часам борьбы и дергания за волосы.

Это может быть скрыто в некотором каталоге conf, как /etc/nginx/default.d/php.confв моей Fedora.


-1

В моем случае php-fpm выдает ошибку 500 без какой-либо регистрации из-за отсутствия модуля php-mysql. Я перенес установку Joomla на другой сервер и забыл об этом. Так apt-get install php-mysqlи служба перезапуска решила это.

Я начал с того, что пытался исправить сломанное ведение журнала без успеха. Наконец, straceя нашел сообщение об ошибке после системных вызовов, связанных с БД. Хотя мой случай не имеет прямого отношения к вопросу оп, я надеюсь, что он может быть полезен.


-4

Проверьте каталог владельца "PHP-FPM"

Ты можешь сделать:

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

5
никогда не устанавливайте / var / log / php-fpm в 777, вы просто сделали свой сервер уязвимым для атаки по символической ссылке (если не хуже)
Лука Гибелли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.