PHP-FPM nie zapisuje do dziennika błędów

161

Właśnie zainstalowałem serwer nginx + php-fpm. Wszystko wydaje się w porządku, poza tym, że PHP-FPM nigdy nie zapisuje błędów w swoim dzienniku.

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;
  }
}

Zrobiłem błędny skrypt php i uruchomiłem go i widzę błąd w przeglądarce internetowej. Również dziennik błędów nginx podaje wyjście stderr z fpm z tym samym komunikatem. Sprawdziłem, czy użytkownik ma uprawnienia do zapisu (próbowałem nawet 777) do wyznaczonego folderu dziennika. Nawet wyznaczony plik error.log został pomyślnie utworzony przez php-fpm. Jednak plik dziennika jest zawsze pusty, niezależnie od tego, jaki skandaliczny błąd został popełniony w skrypcie php.

Co się dzieje?

[Przyczyny znalazłem jakiś czas później]

To było pozwolenie. Zmiana właściciela na użytkowników stron rozwiązała problem.

eidng8
źródło
Warto wspomnieć, że problematyczna wersja php mieści się w przedziale od 5.3.9 do 5.3.14 (stan na dzień dzisiejszy). Powinien działać począwszy od wersji 5.3.15 i 5.4.5.
Anton Babenko
jeśli używasz hhvm + php-fpm z homestead, dziennik znajduje się pod adresem tail /var/log/hhvm/error.log
astroanu
Mam ten sam problem. Wygląda na to, że dostęp i powolny dziennik wymagają różnych uprawnień, dlatego folder jest tworzony za pomocą root-755.
bułeczki

Odpowiedzi:

190

To zadziałało dla mnie:

; 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

Edytować:

Plik do edycji to plik konfigurujący żądaną pulę. Domyślnie jest to: /etc/php-fpm.d/www.conf

michaelbn
źródło
5
<strike> W jakim pliku konfiguracyjnym? php.ini? php-fpm.conf? </strike>. Odkomentowałem to w moim/etc/php-fpm.d/www.conf
Swivel
16
W systemie Ubuntu 14 ten plik znajduje się pod adresem /etc/php5/fpm/pool.d/www.conf
Gilberto Albino
2
Wydaje mi się, że pytanie brzmi, gdzie ten nieuchwytny "główny dziennik błędów" jest ... Och, widzę, jest to wartość php_admin_value[error_log]w tym samym pliku konfiguracyjnym - /var/log/php-fpm/www-error.log na CentOS 7 , np.
Brad Peabody
7
sudo vi /etc/php/7.0/fpm/pool.d/www.confdla mnie
Collin Anderson
To była dla mnie właściwa droga, w Debianie 9.1 i PHP-FPM 7.0
Antwane,
79

Walczyłem z tym przez długi czas, zanim stwierdziłem, że moje dzienniki php-fpm były zapisywane /var/log/upstart/php5-fpm.log. Wydaje się, że jest to błąd między interakcją upstart i php-fpm. Zobacz więcej tutaj: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

Code Commander
źródło
11
Dzięki!! To był dla mnie klucz. Skończyło się na tym, że połączyłem te dwa pliki, ponieważ wiem, że nie będę tego później pamiętać:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair
PHP jest tak zagmatwane ... są wstępnie utworzone, /var/log/php7.0-fpm.logwięc php_admin_value[error_log] = /var/log/fpm-php.www.logprzekieruje do niestandardowego dziennika?
Peter Krauss,
53

Miałem podobny problem i musiałem wykonać następujące czynności w pool.d/www.confpliku

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

Wciąż nie zapisywał pliku dziennika, więc musiałem go utworzyć, touch /var/log/fpm-php.www.logustawiając odpowiedniego właściciela sudo chown www-data:www-data /var/log/fpm-php.www.log.

Po wykonaniu tej czynności i ponownym uruchomieniu php5-fpm, rejestracja została wznowiona.

adnans
źródło
tak było w rzeczywistości! Dostałem nawet kolejne treści pojawiające się na stronie zaraz po błędzie :)
holms
Wielkie dzięki za to! To było rozwiązanie dla mnie na Ubuntu 14.04.1 (Jessie), jeśli pomoże to komukolwiek innemu.
William Turrell
Pewien problem w środowisku vagrant / debian wheezy.
Xosofox
Inne ścieżki, takie jak / var / log /, to tylko strata czasu.
Pedro Góes
1
Czemu?! Nadal jest to problem w fpm-php7.
user1634074
31

Istnieje wiele plików konfiguracyjnych php, ale TO jest ten, który musisz edytować:

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

odkomentuj wiersz, który mówi:

catch_workers_output

Pozwoli to stderr PHP przejść do dziennika błędów php-fpm zamiast / dev / null.

wektor
źródło
2
Dla tych, którzy używają dockera, twoje pliki konfiguracyjne znajdują się:/usr/local/etc/php-fpm.d/
Edward
Z tym conf, gdzie idzie dziennik, at /var/log/php7.0-fpm.log, at /var/log/fpm-php.www.loglub inny?
Peter Krauss,
Gdzie się loguje?
Viktor Joras
26

Zebrałem tutaj spostrzeżenia z szeregu odpowiedzi i przedstawiam kompleksowe rozwiązanie:

Tak więc, jeśli skonfigurujesz nginx z php5-fpm i zarejestrujesz wiadomość za pomocą error_log(), możesz zobaczyć ją /var/log/nginx/error.logdomyślnie.

Problem może się pojawić, jeśli chcesz rejestrować wiele danych (powiedzmy tablicę) za pomocą error_log(print_r($myArr, true));. Jeśli tablica jest wystarczająco duża, wydaje się, że nginxspowoduje to obcięcie wpisu dziennika.

Aby obejść ten problem, możesz skonfigurować fpm( php.net fpm config ) do zarządzania dziennikami. Oto kroki, aby to zrobić.

  1. Otwarte /etc/php5/fpm/pool.d/www.conf:

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

  2. Odkomentuj następujące dwa wiersze, usuwając ;na początku wiersza: (error_log jest zdefiniowany tutaj: php.net )

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

  3. Utwórz /var/log/fpm-php.www.log:

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

  4. Zmień własność /var/log/fpm-php.www.log, aby php5-fpm mógł go edytować:

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

    Uwaga: vagrantto użytkownik, któremu muszę przyznać prawo własności. Możesz zobaczyć, jakiego użytkownika to powinien być dla Ciebie, uruchamiając $ ps aux | grep php.*wwwi patrząc na pierwszą kolumnę.

  5. Zrestartuj php5-fpm:

    $ sudo service php5-fpm restart

Teraz twoje logi będą dostępne /var/log/fpm-php.www.log.

Gezim
źródło
Próbowałem tego, ale „fpm-php.www.log” jest pusty. Dowolny pomysł?
Sudharshan Nair
Wydrukuj swoje phpinfo()i zobacz, czy te ustawienia rzeczywiście zostały odebrane, @SudharshanNair.
Gezim
@Gezim. dzięki za odpowiedź. moja ścieżka do dziennika błędów to /var/log/fpm-php.www.log. Wciąż ten plik jest pusty
Sudharshan Nair
@SudharshanNair, Jeśli log_errorsbłędy są włączone, jedyną inną rzeczą do sprawdzenia jest uprawnienia i własność pliku (krok 4).
Gezim
@Gezim. Dałem 777 uprawnień i prawa własności, ponieważ www-data:www-datanadal nie mam szczęścia. Dowolny pomysł ?
Sudharshan Nair
14

Występuje błąd https://bugs.php.net/bug.php?id=61045 w php-fpm od wersji 5.3.9 i do teraz (5.3.14 i 5.4.4). Obiecana przez programistę poprawka zostanie uruchomiona w następnej wersji. Jeśli nie chcesz czekać - użyj łatki na tej stronie i przebuduj lub cofnij do 5.3.8.

Drewx
źródło
4

W swoim pliku fpm.conf nie ustawiłeś 2 zmiennych, które służą tylko do logowania błędów.

Zmienne to error_log(ścieżka do pliku dziennika błędów) i log_level(poziom rejestrowania błędów).

; 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
khizar ansari
źródło
nie jest wartością domyślną /usr/local/var/phpzamiast /usr/local/php/var? tylko spekulacje.
n611x007
2

w moim przypadku pokazuję, że dziennik błędów zmierzał do /var/log/php-fpm/www-error.log . więc skomentowałem tę linię w /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

i jak wspomniano powyżej, również odkomentowałem tę linię

catch_workers_output = yes

Teraz widzę dzienniki w pliku określonym przez nginx.

enRaiser
źródło
0

Chciałbym dodać kolejną wskazówkę do istniejących odpowiedzi, ponieważ nie rozwiązały one mojego problemu.

Uważaj na następującą dyrektywę nginx w bloku lokalizacji php:

fastcgi_intercept_errors on;

Usunięcie tej żyłki zakończyło wiele godzin walki i wyrywania włosów.

Może być ukryty w jakimś dołączonym katalogu conf, takim jak /etc/nginx/default.d/php.confmoja fedora.

Arsylum
źródło
-1

W moim przypadku php-fpm wyświetla błąd 500 bez żadnego logowania z powodu braku modułu php-mysql. Przeniosłem instalację Joomla na inny serwer i zapomniałem o tym. Więc apt-get install php-mysqlrestart usługi rozwiązał to.

Zacząłem od próby naprawienia zepsutego logowania bez powodzenia. Wreszcie straceznalazłem komunikat o niepowodzeniu po wywołaniach systemowych związanych z db. Chociaż moja sprawa nie jest bezpośrednio związana z pytaniem op, mam nadzieję, że może się przydać.

user3132194
źródło
-4

Sprawdź katalog właściciela „PHP-FPM”

Możesz to zrobić:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
kalculator
źródło
5
nigdy nie ustawiaj / var / log / php-fpm na 777, właśnie
naraziłeś