PHP-FPM не записывает в журнал ошибок - PullRequest
150 голосов
/ 30 декабря 2011

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

Что происходит?

[Обнаружил причину через некоторое время]

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

Ответы [ 9 ]

178 голосов
/ 11 мая 2012

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

; 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

77 голосов
/ 22 января 2015

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

48 голосов
/ 22 апреля 2014

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

31 голосов
/ 06 августа 2012

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

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

раскомментируйте строку с надписью:

catch_workers_output

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

25 голосов
/ 01 ноября 2015

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

Итак, если вы настроили 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.

14 голосов
/ 28 июня 2012

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

3 голосов
/ 20 февраля 2012

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

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

;Файл журнала ошибок;Примечание: префикс по умолчанию - / usr / local / php / var;Значение по умолчанию: log / php-fpm.log

error_log = log/php-fpm.log

;Логарифмический уровень;Возможные значения: предупреждение, ошибка, предупреждение, уведомление, отладка;Значение по умолчанию: уведомление

log_level = notice
2 голосов
/ 26 декабря 2015

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

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

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

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...