PHP-FPM không ghi vào nhật ký lỗi


161

Tôi vừa cài đặt máy chủ nginx + php-fpm. Mọi thứ có vẻ ổn ngoại trừ PHP-FPM không bao giờ ghi lỗi vào nhật ký của nó.

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

Tôi đã tạo một tập lệnh php sai và chạy và thấy đầu ra lỗi trên trình duyệt web. Ngoài ra nhật ký lỗi nginx trạng thái đầu ra stderr từ fpm với cùng một thông báo. Tôi đã kiểm tra xem người dùng có quyền ghi (thậm chí tôi đã thử 777) vào thư mục nhật ký được chỉ định hay không. Ngay cả tệp error.log được chỉ định cũng đã được php-fpm tạo thành công. Tuy nhiên, tệp nhật ký luôn trống, bất kể lỗi nghiêm trọng nào đã được tạo từ tập lệnh php.

Chuyện gì đang xảy ra vậy?

[Tìm thấy lý do khá lâu sau đó]

Đó là sự cho phép. Thay đổi chủ sở hữu để người dùng của trang web giải quyết vấn đề.


Điều đáng nói là phiên bản php có vấn đề nằm trong khoảng từ v5.3.9 đến v5.3.14 (như ngày nay). Nó nên hoạt động bắt đầu từ v5.3.15 và v5.4.5.
Anton Babenko

nếu bạn đang sử dụng hhvm + php-fpm với homestead, nhật ký sẽ ở đuôi /var/log/hhvm/error.log
astroanu

Cùng một vấn đề ở đây. Có vẻ như truy cập và nhật ký chậm cần các quyền khác nhau, do đó thư mục được tạo bằng root-755.
bánh nướng

Câu trả lời:


190

Điều này làm việc cho tôi:

; 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

Biên tập:

Tệp cần chỉnh sửa là tệp cấu hình nhóm bạn muốn. Theo mặc định: /etc/php-fpm.d/www.conf


5
<strike> Trong tập tin cấu hình nào? php.ini? php-fpm.conf? </ strike>. Tôi đã bỏ qua nó bên trong của tôi/etc/php-fpm.d/www.conf
Xoay

16
Trên Ubuntu 14, tập tin này nằm ở /etc/php5/fpm/pool.d/www.conf
Gilberto Albino

2
Tôi đoán câu hỏi sau đó là "nhật ký lỗi chính" khó nắm bắt này ở đâu ... Ồ, tôi hiểu rồi, đó là giá trị của php_admin_value[error_log]cùng một tệp cấu hình đó - /var/log/php-fpm/www-error.log trên CentOS 7 , ví dụ:
Brad Peabody

7
sudo vi /etc/php/7.0/fpm/pool.d/www.confđối với tôi
Collin Anderson

Đây là cách phù hợp với tôi, trên Debian 9.1 và PHP-FPM 7.0
Antwane

79

Tôi đã vật lộn với điều này trong một thời gian dài trước khi tìm thấy nhật ký php-fpm của mình /var/log/upstart/php5-fpm.log. Nó dường như là một lỗi giữa cách thức khởi động và php-fpm tương tác. Xem thêm tại đây: https://bugs.launchpad.net/ubfox/+source/php5/+orms/1319595


11
Cảm ơn!! Đây là chìa khóa cho tôi. Tôi đã kết thúc việc liên kết hai tệp vì tôi biết tôi sẽ không nhớ điều này sau:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair 15/215

PHP rất khó hiểu ... có một bản dựng sẵn /var/log/php7.0-fpm.logvì vậy, php_admin_value[error_log] = /var/log/fpm-php.www.logsẽ chuyển hướng đến nhật ký không chuẩn ??
Peter Krauss

53

Tôi đã có một vấn đề tương tự và phải làm như sau với pool.d/www.conftập tin

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

Nó vẫn không ghi tệp nhật ký nên tôi thực sự phải tạo nó bằng cách touch /var/log/fpm-php.www.logđặt đúng chủ sở hữu sudo chown www-data:www-data /var/log/fpm-php.www.log.

Khi điều này được thực hiện và php5-fpm được khởi động lại, việc đăng nhập đã được tiếp tục.


đó thực sự là trường hợp! Tôi thậm chí đã có một số nội dung xa hơn xuất hiện trên trang web ngay sau khi lỗi :)
holms

Cảm ơn rất nhiều cho việc này! Đây là giải pháp cho tôi trên Ubuntu 14.04.1 (Jessie), nếu nó giúp được ai khác.
William Turrell

Một số vấn đề trong một môi trường khò khè / debian.
Xosofox

Các đường dẫn khác, chẳng hạn như / var / log /, nơi chỉ lãng phí thời gian.
Pedro Góes

1
Tại sao?! Đây vẫn là một vấn đề trên fpm-php7.
dùng1634074

31

Có nhiều tệp cấu hình php, nhưng ĐÂY là tệp bạn cần chỉnh sửa:

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

uncomment dòng nói:

catch_workers_output

Điều đó sẽ cho phép các stderr của PHP đi đến nhật ký lỗi của php-fpm thay vì / dev / null.


2
Đối với những người sử dụng docker, các tệp cấu hình của bạn được đặt:/usr/local/etc/php-fpm.d/
Edward

Với conf này, nơi đăng nhập, tại /var/log/php7.0-fpm.log, tại /var/log/fpm-php.www.loghoặc khác?
Peter Krauss

Nó đăng nhập vào đâu?
Viktor Joras

26

Tôi đã thu thập những hiểu biết sâu sắc từ một loạt các câu trả lời ở đây và tôi trình bày một giải pháp toàn diện:

Vì vậy, nếu bạn thiết lập nginx với php5-fpm và đăng nhập một thông báo bằng cách sử dụng, error_log()bạn có thể thấy nó /var/log/nginx/error.logtheo mặc định.

Một vấn đề có thể phát sinh nếu bạn muốn đăng nhập nhiều dữ liệu (giả sử một mảng) bằng cách sử dụng error_log(print_r($myArr, true));. Nếu một mảng đủ lớn, có vẻ như nó nginxsẽ cắt bớt mục nhật ký của bạn.

Để giải quyết vấn đề này, bạn có thể định cấu hình fpm( php.net fpm config ) để quản lý nhật ký. Dưới đây là các bước để làm như vậy.

  1. Mở /etc/php5/fpm/pool.d/www.conf:

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

  2. Bỏ ghi chú hai dòng sau bằng cách xóa ;ở đầu dòng: (error_log được định nghĩa ở đây: php.net )

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

  3. Tạo /var/log/fpm-php.www.log:

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

  4. Thay đổi quyền sở hữu /var/log/fpm-php.www.logđể php5-fpm có thể chỉnh sửa nó:

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

    Lưu ý: vagrantlà người dùng mà tôi cần trao quyền sở hữu. Bạn có thể thấy người dùng này nên dùng gì cho bạn bằng cách chạy $ ps aux | grep php.*wwwvà nhìn vào cột đầu tiên.

  5. Khởi động lại php5-fpm:

    $ sudo service php5-fpm restart

Bây giờ nhật ký của bạn sẽ được trong /var/log/fpm-php.www.log.


Tôi đã thử điều này, Vẫn "fpm-php.www.log" trống. Bất kỳ ý tưởng?
Sudharshan Nair

In của bạn phpinfo()và xem nếu các cài đặt này thực sự đã được chọn, @SudharshanNair.
Gezim

@Gezim. Cảm ơn vì đã trả lời. đường dẫn nhật ký lỗi của tôi là /var/log/fpm-php.www.log. Tuy nhiên, tập tin này vẫn trống
Sudharshan Nair

@SudharshanNair, Nếu log_errorslỗi được bật, điều duy nhất khác cần kiểm tra là sự cho phép và quyền sở hữu tệp (bước 4).
Gezim

@Gezim. Tôi đã cấp cho 777 quyền và quyền sở hữu www-data:www-data, Vẫn không gặp may. Bất kỳ ý tưởng ?
Sudharshan Nair

14

Có một lỗi https://bugs.php.net/orms.php?id=61045 trong php-fpm từ v5.3.9 và cho đến bây giờ (5.3,14 và 5.4.4). Nhà phát triển hứa sẽ sửa chữa trong phiên bản tiếp theo. Nếu bạn không muốn chờ đợi - hãy sử dụng bản vá trên trang đó và xây dựng lại hoặc quay lại thành 5.3.8.


4

Trong tệp fpm.conf của bạn, bạn chưa đặt 2 biến chỉ dành cho ghi nhật ký lỗi.

Các biến là error_log(đường dẫn tệp của tệp nhật ký lỗi của bạn) và log_level(mức ghi nhật ký lỗi).

; 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

không phải là mặc định /usr/local/var/phpthay vì /usr/local/php/var? chỉ cần suy đoán.
n611x007

2

trong trường hợp của tôi, tôi cho thấy rằng nhật ký lỗi sẽ xuất hiện /var/log/php-fpm/www-error.log . vì vậy tôi đã nhận xét dòng này trong /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

và như đã nói ở trên tôi cũng không chú ý đến dòng này

catch_workers_output = yes

Bây giờ tôi có thể thấy các bản ghi trong tệp được chỉ định bởi nginx.


0

Tôi muốn thêm một mẹo khác vào các câu trả lời hiện có vì chúng không giải quyết được vấn đề của tôi.

Coi chừng chỉ thị nginx sau trong khối vị trí php của bạn:

fastcgi_intercept_errors on;

Loại bỏ dòng này đã chấm dứt nhiều giờ vật lộn và giật tóc.

Nó có thể được ẩn trong một số thư mục conf bao gồm /etc/nginx/default.d/php.conftrong fedora của tôi.


-1

Trong trường hợp của tôi, php-fpm xuất ra lỗi 500 mà không có bất kỳ đăng nhập nào do thiếu mô-đun php-mysql. Tôi đã chuyển cài đặt j Joomla sang một máy chủ khác và quên nó đi. Vì vậy, apt-get install php-mysqlvà khởi động lại dịch vụ đã giải quyết nó.

Tôi bắt đầu với việc cố gắng sửa lỗi đăng nhập bị hỏng mà không thành công. Cuối cùng với stracetôi tìm thấy thông báo lỗi sau các cuộc gọi hệ thống liên quan đến db. Mặc dù trường hợp của tôi không liên quan trực tiếp đến câu hỏi của op, tôi hy vọng nó có thể hữu ích.


-4

Kiểm tra thư mục Chủ sở hữu của "PHP-FPM"

Bạn có thể làm:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/

5
không bao giờ đặt / var / log / php-fpm thành 777, bạn chỉ khiến máy chủ của mình dễ bị tấn công symlink (nếu không tệ hơn)
Luca Gibelli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.