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