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.


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


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


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.


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.


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.


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.


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

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.


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.


-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.


-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/

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.