PHP-FPM tidak menulis ke log kesalahan

161

Saya baru saja menginstal server nginx + php-fpm. Semuanya tampak baik kecuali bahwa PHP-FPM tidak pernah menulis kesalahan pada log-nya.

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

Saya telah membuat skrip php yang salah dan menjalankan, dan melihat output kesalahan di browser web. Juga log kesalahan nginx menyatakan stderr output dari fpm dengan pesan yang sama. Saya telah memeriksa apakah pengguna telah menulis (saya bahkan sudah mencoba 777) izin ke folder log yang ditunjuk. Bahkan file error.log yang ditunjuk telah berhasil dibuat oleh php-fpm. Namun, file log selalu kosong, tidak peduli kesalahan apa yang dibuat dari skrip php.

Apa yang sedang terjadi?

[Menemukan alasannya beberapa saat kemudian]

Itu izin. Mengubah pemilik ke pengguna situs memecahkan masalah.

eidng8
sumber
Perlu disebutkan bahwa versi php yang bermasalah adalah antara v5.3.9 dan v5.3.14 (seperti pada hari ini). Ini harus bekerja mulai dari v5.3.15 dan v5.4.5.
Anton Babenko
jika Anda menggunakan hhvm + php-fpm dengan homestead log ada di tail /var/log/hhvm/error.log
astroanu
Masalah yang sama disini. Sepertinya akses dan log lambat memerlukan izin yang berbeda, sehingga folder tersebut dibuat dengan root-755.
scone

Jawaban:

190

Ini bekerja untuk saya:

; 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

Edit:

File yang akan diedit adalah file yang mengonfigurasi kumpulan yang Anda inginkan. Secara default-nya: /etc/php-fpm.d/www.conf

michaelbn
sumber
5
<strike> Dalam file konfigurasi apa? php.ini? php-fpm.conf? </strike>. Saya menghapus komentarnya di dalam/etc/php-fpm.d/www.conf
Swivel
16
Pada Ubuntu 14 file ini terletak di /etc/php5/fpm/pool.d/www.conf
Gilberto Albino
2
Saya kira pertanyaannya adalah di mana "log kesalahan utama" yang sulit dipahami ini adalah ... Oh, begitu, ini nilai dari php_admin_value[error_log]file konfigurasi yang sama - /var/log/php-fpm/www-error.log pada CentOS 7 , misalnya
Brad Peabody
7
sudo vi /etc/php/7.0/fpm/pool.d/www.confuntuk saya
Collin Anderson
Ini adalah cara yang tepat bagi saya, pada Debian 9.1 dan PHP-FPM 7.0
Antwane
79

Saya berjuang dengan ini untuk waktu yang lama sebelum menemukan log php-fpm saya ditulis /var/log/upstart/php5-fpm.log. Tampaknya menjadi bug antara bagaimana pemula dan php-fpm berinteraksi. Lihat lebih lanjut di sini: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

Komandan Kode
sumber
11
Terima kasih!! Ini adalah kunci untuk saya. Saya akhirnya menghubungkan kedua file karena saya tahu saya tidak akan mengingat ini nanti:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair
PHP sangat membingungkan ... ada yang dibuat sebelumnya /var/log/php7.0-fpm.log, php_admin_value[error_log] = /var/log/fpm-php.www.logapakah akan mengarahkan ulang ke log non-standar ??
Peter Krauss
53

Saya memiliki masalah serupa dan harus melakukan hal berikut ke pool.d/www.conffile

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

Itu masih belum menulis file log jadi saya benar-benar harus membuatnya dengan touch /var/log/fpm-php.www.logmenetapkan pemilik yang benar sudo chown www-data:www-data /var/log/fpm-php.www.log.

Setelah ini selesai, dan php5-fpm dimulai kembali, logging dilanjutkan.

adnans
sumber
itu sebenarnya yang terjadi! Saya bahkan mendapatkan beberapa konten lebih lanjut muncul di situs setelah kesalahan :)
holms
Terima kasih banyak untuk ini! Ini adalah solusi bagi saya di Ubuntu 14.04.1 (Jessie), jika itu membantu orang lain.
William Turrell
Beberapa masalah dalam lingkungan wheezy gelandangan / debian.
Xosofox
Jalur lain, seperti / var / log /, di mana hanya membuang waktu.
Pedro Góes
1
Mengapa?! Ini masih menjadi masalah di fpm-php7.
user1634074
31

Ada beberapa file konfigurasi php, tetapi INI yang perlu Anda edit:

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

batalkan komentar pada baris yang mengatakan:

catch_workers_output

Itu akan memungkinkan PHP stderr untuk pergi ke log kesalahan php-fpm bukan / dev / null.

vektor
sumber
2
Bagi mereka yang menggunakan buruh pelabuhan file konfigurasi Anda berada:/usr/local/etc/php-fpm.d/
Edward
Dengan conf ini, di mana log, at /var/log/php7.0-fpm.log, at /var/log/fpm-php.www.logatau lainnya?
Peter Krauss
Di mana itu login?
Viktor Joras
26

Saya mengumpulkan wawasan dari banyak jawaban di sini dan saya menyajikan solusi komprehensif:

Jadi, jika Anda mengatur nginx dengan php5-fpm dan mencatat pesan menggunakan error_log()Anda dapat melihatnya secara /var/log/nginx/error.logdefault.

Masalah dapat muncul jika Anda ingin mencatat banyak data (katakanlah array) menggunakan error_log(print_r($myArr, true));. Jika array cukup besar, tampaknya nginxakan memotong entri log Anda.

Untuk menyiasatinya, Anda dapat mengonfigurasi fpm( php.net fpm config ) untuk mengelola log. Inilah langkah-langkah untuk melakukannya.

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

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

  2. Batalkan komentar dua baris berikut dengan menghapus ;di awal baris: (error_log didefinisikan di sini: php.net )

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

  3. Buat /var/log/fpm-php.www.log:

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

  4. Ubah kepemilikan /var/log/fpm-php.www.logsehingga php5-fpm dapat mengeditnya:

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

    Catatan: vagrantadalah pengguna yang harus saya berikan kepemilikan. Anda dapat melihat pengguna ini untuk Anda dengan menjalankan $ ps aux | grep php.*wwwdan melihat kolom pertama.

  5. Mulai ulang php5-fpm:

    $ sudo service php5-fpm restart

Sekarang log Anda akan berada di /var/log/fpm-php.www.log.

Gezim
sumber
Saya mencoba ini, Masih "fpm-php.www.log" kosong. Ada ide?
Sudharshan Nair
Cetak Anda phpinfo()dan lihat apakah pengaturan ini benar-benar diambil, @SudharshanNair.
Gezim
@ Gezim. terima kasih untuk balasan Anda. jalur log kesalahan saya adalah /var/log/fpm-php.www.log. Tetap file ini kosong
Sudharshan Nair
@SudharshanNair, Jika log_errorskesalahan diaktifkan, satu-satunya hal lain yang perlu diperiksa adalah izin dan kepemilikan file (langkah 4).
Gezim
@ Gezim. Saya telah memberikan 777 izin dan kepemilikan sebagai www-data:www-data, Masih belum berhasil. Ada ide ?
Sudharshan Nair
14

Ada bug https://bugs.php.net/bug.php?id=61045 di php-fpm dari v5.3.9 dan sampai sekarang (5.3.14 dan 5.4.4). Pengembang berjanji memperbaiki akan ditayangkan dalam rilis berikutnya. Jika Anda tidak ingin menunggu - gunakan tambalan pada halaman itu dan bangun kembali atau kembalikan ke 5.3.8.

Drewx
sumber
4

Dalam file fpm.conf Anda, Anda belum menetapkan 2 variabel yang hanya untuk logging kesalahan.

Variabelnya adalah error_log(path file dari file log kesalahan Anda) dan log_level(tingkat logging kesalahan).

; 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
sumber
bukankah standarnya /usr/local/var/phpbukan /usr/local/php/var? hanya berspekulasi.
n611x007
2

dalam kasus saya, saya menunjukkan bahwa log kesalahan akan ke /var/log/php-fpm/www-error.log . jadi saya berkomentar di baris ini di /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

dan seperti yang dikatakan di atas saya juga menghapus tanda komentar pada baris ini

catch_workers_output = yes

Sekarang saya bisa melihat log dalam file yang ditentukan oleh nginx.

idRaiser
sumber
0

Saya ingin menambahkan tip lain ke jawaban yang ada karena mereka tidak menyelesaikan masalah saya.

Perhatikan arahan nginx berikut di blok lokasi php Anda:

fastcgi_intercept_errors on;

Menghilangkan garis ini telah mengakhiri berjam-jam berjuang dan menarik rambut.

Itu bisa disembunyikan di beberapa direktori conf yang disertakan seperti /etc/nginx/default.d/php.confdi fedora saya.

Arsylum
sumber
-1

Dalam kasus saya, php-fpm menghasilkan 500 kesalahan tanpa pencatatan karena modul php-mysql hilang. Saya memindahkan instalasi joomla ke server lain dan melupakannya. Jadi apt-get install php-mysqldan restart layanan menyelesaikannya.

Saya mulai dengan mencoba memperbaiki pembalakan yang rusak tanpa hasil. Akhirnya dengan stracesaya menemukan pesan gagal setelah panggilan sistem terkait db. Meskipun kasus saya tidak berhubungan langsung dengan pertanyaan op, saya harap ini bisa bermanfaat.

pengguna3132194
sumber
-4

Periksa direktori Pemilik "PHP-FPM"

Anda dapat melakukan:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
kalculator
sumber
5
jangan pernah atur / var / log / php-fpm ke 777, Anda baru saja membuat server Anda rentan terhadap serangan symlink (jika tidak lebih buruk)
Luca Gibelli