syst0m
syst0m

Reputation: 391

No php-fpm error logs from docker container

Using apache + php-fpm containers in docker-compose, I can't get the php-fpm container to display any errors.

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 only shows php-fpm access logs, no error logs.

Tried all solutions proposed in post proposed as possible duplicate: PHP-FPM doesn't write to error log None of them worked for me, check my comments down below.

Upvotes: 18

Views: 50259

Answers (4)

Richard So
Richard So

Reputation: 23

Because the configuration for using in docker, usually the target program will generate error into STDERR.

The "docker logs" command will dump the log gotten from the original STDOUT by default; if you want to check the log from original STDERR, you must use this command:

docker logs -f {container name here} > /dev/null

this is to direct the original STDOUT to /dev/null and then the log from STDERR comes out

Upvotes: 0

Michal Fapso
Michal Fapso

Reputation: 1322

In my case it was a php script calling:

error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
ini_set('display_errors', ...);
ini_set('log_errors', ...);
ini_set("error_log", ...);

which overrided global php settings. So sometimes you also need to check your php files.

Upvotes: 0

FullStack Alex
FullStack Alex

Reputation: 2093

In my case it was the /usr/local/etc/php-fpm.d/docker.conf which caused the troubles:

[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

The error_log directive's value of /proc/self/fd/2 causes the log being written into the terminal/console where the docker-compose up is running.

I just had to create a custom global fpm config file within the /usr/local/etc/php-fpm.d/ directory and make it execute as the last one by naming it zz-global.conf, so it can override the docker.conf values. Then I just needed to set the value for the error_log to a custom path within the php-fpm container e.g.:

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

That's it.

Maybe worth mentioning: my php.ini (modified php.ini-development) has following custom error logging related values:

; 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

Upvotes: 3

mrbarletta
mrbarletta

Reputation: 922

Struggle hours to get this working.

In the file docker-compose.yml I mounted my logs (so they persist)

        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

In the phpSettings.conf file I have this:

[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

Make sure the mounted log files exist before starting the docker.

the trick seems to be naming my settings zzz-phpSettings.conf so is the last one to load. I overwrite the default docker php image www.conf settings with the very same settings (except the listen 0.0.0.0:9000).

In this php-fpm+Nginx setup I managed to have nginx (error/access) logs to its own location + php-fpm error/access logs to its own place too, so loggins looks really nice.

Upvotes: 2

Related Questions