Reputation: 391
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
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
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
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
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