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

标签 php apache docker docker-compose

在 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 它们都不适合我,请在下方查看我的评论。

最佳答案

在我的例子中,是 /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://stackoverflow.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

关于php - 没有来自 docker 容器的 php-fpm 错误日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53417572/

相关文章:

php - 在 php 中更改目录权限 (chmod)

docker - 我可以在不提交的情况下维持Docker容器的状态吗

php - CakePHP 模型关联深层模型包含

php - 错误回复 : declaring integer in MySQL stored procedure

php - 为什么 apache2 不重定向到 https,或者按照我对 mediawiki 的期望行事?

node.js - 为什么 apache 重写 URL 两次?

python-3.x - 在Docker容器中找不到环境变量

linux - 从 Dockerfile 安装 Apache

php - 如何在没有重复的情况下将文本存储在数据库中并且单词顺序无关紧要?

php - 选择一行没有重复条目关键字