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 з присадибною ділянкою, журнал знаходиться у
хвостику

Тут же проблема. Здається, що доступ і повільний журнал потребують різних дозволів, тому папка створюється з root-755.
scones

Відповіді:


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? </strike>. Я коментував це всередині свого/etc/php-fpm.d/www.conf
Поворот

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 , наприклад
Бред Пібоді

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 (Jessie), якщо це допомагає комусь іншому.
Вільям Террелл

Певна проблема у бродячому / дебіанському хрипкому середовищі.
Xosofox

Інші шляхи, наприклад / var / log /, де просто марно витрачають час.
Педро Гос

1
Чому ?! Це все ще проблема у fpm-php7.
користувач1634074

31

Існує декілька файлів конфігурації php, але це вам потрібно для редагування:

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

прокоментуйте рядок, що говорить:

catch_workers_output

Це дозволить PHPsderder перейти до журналу помилок php-fpm замість / dev / null.


2
Для тих, хто використовує docker, розміщені ваші конфігураційні файли:/usr/local/etc/php-fpm.d/
Едвард

З цим конф, куди йде журнал, at /var/log/php7.0-fpm.log, at /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" порожній. Будь-яка ідея?
Sudharshan Nair

Роздрукуйте свої дані phpinfo()і подивіться, чи справді ці налаштування підібрані, @SudharshanNair.
Гезим

@Gezim. Спасибі за Вашу відповідь. мій шлях журналу помилок /var/log/fpm-php.www.log. І все-таки цей файл порожній
Sudharshan Nair,

@SudharshanNair, якщо log_errors помилки ввімкнено, єдине, що потрібно перевірити, - це дозвіл та право власності на файл (крок 4).
Гезим

@Gezim. Я дав 777 дозволів та права власності www-data:www-data, все-таки не пощастило. Будь-яка ідея?
Sudharshan Nair

14

Існує помилка https://bugs.php.net/bug.php?id=61045 у php-fpm від v5.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;

Видалення цієї лінії закінчило багатогодинну боротьбу та витягування волосся.

Це може бути приховано в якомусь включеному конф-каталозі, як /etc/nginx/default.d/php.confу моїй Fedora.


-1

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

Я почав із спроби виправити зламаний журнал без успіху. Нарешті, straceя знайшов повідомлення про помилку після системних викликів, пов'язаних з db. Хоча мій випадок не пов'язаний безпосередньо з питанням ОП, я сподіваюся, що це може бути корисним.


-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, ви просто зробили ваш сервер уразливим для атаки символьної посилання (якщо не гірше)
Luca Gibelli
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.