没有来自 docker 容器的 php-fpm 错误日志

Posted

技术标签:

【中文标题】没有来自 docker 容器的 php-fpm 错误日志【英文标题】:No php-fpm error logs from docker container 【发布时间】:2019-04-24 08:20:25 【问题描述】:

在 docker-compose 中使用 apache + php-fpm 容器,我无法让 php-fpm 容器显示任何错误。

docker-compose.yml

version: '3'

services:
  php:
    build:
      context: ./php
    ports:
      - 9000:9000
    volumes:
      - ./code:/code
      - ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf
    environment:
      ENVIRONMENT: local
  web:
    image: httpd:2.4
    depends_on:
      - php
    ports:
      - 80:80
    volumes:
      - ./code:/usr/local/apache2/htdocs
      - ./web/httpd.conf:/usr/local/apache2/conf/httpd.conf
    depends_on:
      - php

php-fpm Dockerfile:

FROM php:5.6-fpm 

php-fpm www.conf:

[global]
error_log = /proc/self/fd/2

[www]

user = www-data
group = www-data

listen = nginx:9000

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; Logging

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

clear_env = no

; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes

php_flag[display_errors] = on
php_admin_flag[log_errors] = on
;php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
php_admin_value[display_startup_errors] = on

docker-compose logs 只显示 php-fpm 访问日志,没有错误日志。

尝试了帖子中提出的所有解决方案,尽可能重复:PHP-FPM doesn't write to error log 它们都不适合我,请在下面查看我的 cmets。

【问题讨论】:

PHP-FPM doesn't write to error log的可能重复 那张海报没有使用 Docker? 不应该真的有所作为@syst0m 我个人在 vhosts.ini 文件中的 php.ini conf.d 下指定了我的错误日志位置。我没有任何问题,我正在使用与您相同的图像的 php 7.2 版本。您能否通过“ssh”进入您的容器docker exec -it php container name bash 并运行所有需要的命令/测试来检查您的 conf 文件是否已全部生效。 我已经有了这个指令“catch_workers_output = yes”。检查我发布的 www.conf。 【参考方案1】:

就我而言,是 /usr/local/etc/php-fpm.d/docker.conf 引起了麻烦:

[global]
error_log = /proc/self/fd/2

; https://github.com/docker-library/php/pull/725#issuecomment-443540114
log_limit = 8192

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

clear_env = no

; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes
decorate_workers_output = no

error_log 指令的值/proc/self/fd/2 导致日志被写入运行docker-compose up 的终端/控制台。

我只需要在/usr/local/etc/php-fpm.d/ 目录中创建一个自定义的全局 fpm 配置文件,并将其命名为zz-global.conf,使其作为最后一个执行,因此它可以覆盖docker.conf 值。然后我只需要将 error_log 的值设置为 php-fpm 容器中的自定义路径,例如:

[global]
error_log = /var/www/logs/php-fpm-error.log

就是这样。

也许值得一提:我的 php.ini(修改后的 php.ini-development)具有以下自定义错误记录相关值:

; https://***.com/a/10546138/4721232
; 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
php_admin_flag[log_errors] = on
php_admin_flag[display_errors] = on
php_admin_value[error_reporting] = E_ALL
php_admin_value[error_log] = /var/log/error.log
access.log = /var/www/logs/php-fpm-access.log

【讨论】:

【参考方案2】:

努力工作好几个小时。

在文件docker-compose.yml 中,我挂载了我的日志(所以它们会持续存在)

        volumes:
        - ./phpSettings.conf:/usr/local/etc/php-fpm.d/zzz-phpSettings.conf
        - ./logs/php-error.log:/var/log/error.log
        - ./logs/php-access.log:/var/log/access.log

phpSettings.conf 文件中我有这个:

[www]
user = www-data
group = www-data
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

catch_workers_output = yes
php_admin_flag[log_errors] = on
php_admin_flag[display_errors] = off
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
php_admin_value[error_log] = /var/log/error.log
access.log = /var/log/access.log
php_value[memory_limit] = 512M
php_value[post_max_size] = 24M
php_value[upload_max_filesize] = 24M

在启动 docker 之前确保挂载的日志文件存在。

诀窍似乎是将我的设置命名为zzz-phpSettings.conf,所以最后一个要加载。我用相同的设置覆盖了默认的 docker php 图像 www.conf 设置(除了监听 0.0.0.0:9000)。

在这个 php-fpm+Nginx 设置中,我设法让 nginx(错误/访问)日志到它自己的位置 + php-fpm 错误/访问日志到它自己的位置,所以登录看起来非常好。

【讨论】:

这可以将日志输出到持久文件中,但 docker 日志驱动程序对此一无所知。最初的问题是“docker-compose logs”没有显示错误日志。知道如何解决这个问题吗? 我的 docker compose 显示了这个设置的日志,apache 错误日志被定向到提到的文件。另外,我不同意这个问题是关于查看 docker-compose 中的日志。 问题中具体说明:“docker-compose logs 只显示php-fpm访问日志,不显示错误日志。”所以试图在 docker logging 驱动程序中获取错误日志。如果您有任何建议,我也将不胜感激。 并且还说:尝试了帖子中提出的所有解决方案,建议尽可能重复 --- 将日志写入文件,表明他对此没问题,而不仅仅是寻找 docker compose logs。 :P

以上是关于没有来自 docker 容器的 php-fpm 错误日志的主要内容,如果未能解决你的问题,请参考以下文章

docker php-fpm 一直重启问题处理

如何为多个PHP-FPM容器构建单一的Nginx Docker镜像

docker-compose启动php-fpm报错问题

来自 composer:1.8.4 的 php-fpm docker 中的 Composer

docker下如何搭建MySQL+php-fpm+nginx容器环境,本文详解

Nginx-proxy docker 接收来自 php-fpm docker 的 stderr 输出(导致 502 错误)