No php-fpm error logs from docker container

25,156

Solution 1

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.

Solution 2

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

Share:
25,156
syst0m
Author by

syst0m

Updated on August 09, 2022

Comments

  • syst0m
    syst0m almost 2 years

    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.

  • emmdee
    emmdee over 4 years
    This works to get logs out into persistent files but the docker logging driver knows nothing about it. The original question stated "docker-compose logs" didn't show the error logs. Any idea how to solve that problem?
  • mrbarletta
    mrbarletta over 4 years
    my docker compose shows logs with this setup, the apache error logs are directed to the files mentioned. Also, I don't agree this question was about seeing the logs in docker-compose.
  • emmdee
    emmdee over 4 years
    Specifically stated in the question: "docker-compose logs only shows php-fpm access logs, no error logs." so trying to get the error logs in docker logging driver. If you have any advice would appreciate it trying to solve this myself as well.
  • mrbarletta
    mrbarletta over 4 years
    And also said that: Tried all solutions proposed in post proposed as possible duplicate --- which is writing logs to a file, indicating that he is ok with that and not only looking for docker compose logs. :P