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
Anton Babenko

หากคุณใช้ hhvm + php-fpm กับ homestead บันทึกจะอยู่ที่ tail /var/log/hhvm/error.log
astroanu

ปัญหาเดียวกันที่นี่ ดูเหมือนว่าการเข้าถึงและการบันทึกช้าจำเป็นต้องใช้สิทธิ์ที่แตกต่างกันดังนั้นโฟลเดอร์จะถูกสร้างขึ้นด้วย root-755
สกอร์

คำตอบ:


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 </ ตี> ฉันไม่ใส่เครื่องหมายข้อคิดเห็นไว้ภายใน/etc/php-fpm.d/www.conf
หมุน

16
ใน Ubuntu 14 ไฟล์นี้อยู่ที่ /etc/php5/fpm/pool.d/www.conf
Gilberto Albino

2
ฉันเดาว่าคำถามคือที่ "บันทึกข้อผิดพลาดหลัก" ที่เข้าใจยากนี้คือ ... โอ้ฉันเข้าใจแล้วว่ามันเป็นค่าของphp_admin_value[error_log]ไฟล์ config เดียวกันนั้น - /var/log/php-fpm/www-error.log บน CentOS 7 เช่น
แบรดพีบอดี

7
sudo vi /etc/php/7.0/fpm/pool.d/www.confสำหรับฉัน
Collin Anderson

นี่เป็นวิธีที่เหมาะสมสำหรับฉันใน Debian 9.1 และ PHP-FPM 7.0
Antwane

79

ฉันต่อสู้กับเรื่องนี้มาเป็นเวลานานก่อนที่จะหาฉันบันทึก PHP-FPM /var/log/upstart/php5-fpm.logถูกเขียนไปยัง ดูเหมือนว่าจะเป็นข้อบกพร่องระหว่างวิธีการพุ่งพรวดและ 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จะเปลี่ยนเส้นทางไปยังบันทึกที่ไม่ได้มาตรฐาน ??
Peter Krauss

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.logsudo chown www-data:www-data /var/log/fpm-php.www.log

เมื่อทำสิ่งนี้เสร็จแล้วและ php5-fpm เริ่มต้นใหม่การบันทึกจะทำงานต่อ


ที่จริงแล้วเป็นกรณี! ฉันยังมีบางเนื้อหาละเอียดเพิ่มเติมปรากฏบนเว็บไซต์ขวาหลังจากข้อผิดพลาด :)
Holms

ขอบคุณมากสำหรับสิ่งนี้! นี่คือทางออกสำหรับฉันใน Ubuntu 14.04.1 (Jessie) ถ้ามันช่วยคนอื่น
William Turrell

ปัญหาบางอย่างในสภาพแวดล้อมที่แปลกประหลาด / debian
Xosofox

เส้นทางอื่น ๆ เช่น / var / log / ซึ่งเสียเวลาเปล่า
Pedro Góes

1
ทำไม?! ยังคงมีปัญหาใน fpm-php7
user1634074

31

มีไฟล์กำหนดค่า php หลายไฟล์ แต่นี่คือไฟล์ที่คุณต้องการแก้ไข:

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

uncomment บรรทัดที่ระบุว่า:

catch_workers_output

ที่จะช่วยให้ PHPs stderr ไปที่บันทึกข้อผิดพลาดของ php-fpm แทน / dev / null


2
สำหรับผู้ใช้ docker ไฟล์ปรับแต่งของคุณจะอยู่:/usr/local/etc/php-fpm.d/
เอ็ดเวิร์ด

ด้วยความเชื่อมั่นนี้ไปที่ไหนบันทึกที่/var/log/php7.0-fpm.logที่ /var/log/fpm-php.www.logหรืออื่น ๆ ?
Peter Krauss

มันเข้าสู่ระบบที่ไหน?
Viktor Joras

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

@Gezim ขอบคุณสำหรับการตอบกลับของคุณ. /var/log/fpm-php.www.logเส้นทางบันทึกข้อผิดพลาดของฉันคือ ไฟล์นี้ยังว่างเปล่า
Sudharshan Nair

@SudharshanNair หากมีlog_errorsข้อผิดพลาดเกิดขึ้นสิ่งอื่น ๆ ที่ต้องตรวจสอบคือสิทธิ์และความเป็นเจ้าของไฟล์ (ขั้นตอนที่ 4)
Gezim

@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 แม้ว่ากรณีของฉันจะไม่เกี่ยวข้องโดยตรงกับคำถามของ op ฉันหวังว่ามันจะมีประโยชน์


-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 คุณเพียงแค่ทำให้เซิร์ฟเวอร์ของคุณเสี่ยงต่อการโจมตี symlink (ถ้าไม่เลว)
Luca Gibelli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.