Logging

無法將 php7.3 fpm-alpine 錯誤日誌發送到 docker 容器中的 std

  • May 26, 2019

我無法讓 php-fpm 錯誤日誌出現在 docker std 中。到目前為止,我已經嘗試了很多建議,但由於某種原因根本沒有進展。我正在發布我的整個設置,以便有人可以幫助我正確的方向。我所看到的只是app_php_1 | 172.21.0.7 - 06/Apr/2019:12:26:37 +0000 "GET /index.php" 500

PHP-FPM 程式碼

Dockerfile

FROM php:7.2.13-fpm-alpine3.8

RUN apk update \
&& apk add --no-cache $PHPIZE_DEPS \
   bash git zip unzip

RUN docker-php-ext-install opcache
RUN docker-php-ext-enable opcache

RUN rm -rf /var/cache/apk/*

COPY php.ini /usr/local/etc/php/conf.d/php.override.ini
COPY www.conf /usr/local/etc/php-fpm.d/www.conf

WORKDIR /app

CMD ["php-fpm", "--nodaemonize"]

php.ini

[php]
date.timezone=UTC
log_errors=On
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors=Off
max_execution_time=60
memory_limit=256M

[opcache]
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
realpath_cache_size=4096K
realpath_cache_ttl=600

www.conf

[global]
daemonize=no

[www]
user=www-data
group=www-data

listen=app_nginx:9000

pm=dynamic
pm.max_children=30
pm.start_servers=2
pm.min_spare_servers=2
pm.max_requests=1000

NGINX

Dockerfile

FROM nginx:1.15.8-alpine

RUN apk add --no-cache bash

RUN rm -rf /var/cache/apk/*

COPY app.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf
COPY app_ssl.crt /etc/ssl/certs/app_ssl.crt
COPY app_ssl.key /etc/ssl/private/app_ssl.key

應用程序配置文件

server {
   listen 80;

   server_name localhost;

   root /app/public;

   listen 443 default_server ssl;
   ssl_certificate /etc/ssl/certs/app_ssl.crt;
   ssl_certificate_key /etc/ssl/private/app_ssl.key;

   location / {
       try_files $uri /index.php$is_args$args;
   }

   location ~ ^/index\.php(/|$) {
       fastcgi_pass app_php:9000;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       fastcgi_hide_header X-Powered-By;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
       fastcgi_param DOCUMENT_ROOT $realpath_root;
       internal;
   }

   location ~ \.php$ {
       return 404;
   }
}

nginx.conf

user nginx;

worker_processes 2;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
   worker_connections 1024;

   use epoll;
}

http {
   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   log_format json_combined escape=json
     '{'
       '"time_local":"$time_local",'
       '"remote_addr":"$remote_addr",'
       '"remote_user":"$remote_user",'
       '"request":"$request",'
       '"status": "$status",'
       '"body_bytes_sent":"$body_bytes_sent",'
       '"request_time":"$request_time",'
       '"http_referrer":"$http_referer",'
       '"http_user_agent":"$http_user_agent"'
     '}';

   access_log /var/log/nginx/access.log json_combined;

   fastcgi_buffers 8 16k;
   fastcgi_buffer_size 32k;
   fastcgi_connect_timeout 300;
   fastcgi_send_timeout 300;
   fastcgi_read_timeout 300;

   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;

   keepalive_timeout 65;

   server_tokens off;

   add_header X-Content-Type-Options nosniff;
   add_header X-XSS-Protection '1; mode=block';
   add_header X-Frame-Options DENY;
   add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';
   add_header 'Referrer-Policy' 'no-referrer-when-downgrade';

   types_hash_max_size 2048;

   gzip on;

   include /etc/nginx/conf.d/*.conf;
}

碼頭工人-compose.yml

version: "3"

services:
 app_php:
   build:
     context: "./php"
   volumes:
     - "../..:/app:consistent"
 app_nginx:
   build:
     context: "./nginx"
   ports:
     - "5080:80"
     - "5443:443"
   volumes:
     - "../..:/app:consistent"
   depends_on:
     - "aapp_php"

我嘗試了什麼

我彼此獨立地嘗試了這些/文件,而不是一次完成。

  • 更改/proc/self/fd/2/dev/stdout/ /dev/stderrforerror_log和文件中的access.log屬性/usr/local/etc/php-fpm.d/docker.conf
  • 在文件底部添加了以下程式碼www.conf
catch_workers_output = yes
php_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm-error.log
php_admin_value[error_log] = /dev/stdout
php_admin_value[error_log] = /dev/stderr
  • 還有一些,但我忘記了。

這似乎現在起作用了。我在此範例中進行了簡化,以使其易於觀察。


my_php_1    | [26-May-2019 09:40:40] NOTICE: fpm is running, pid 1
my_php_1    | [26-May-2019 09:40:40] NOTICE: ready to handle connections
my_php_1    | 172.22.0.3 -  26/May/2019:09:40:51 +0000 "GET /index.php" 500
my_nginx_1  | 172.22.0.1 - - [26/May/2019:09:40:51 +0000] "GET / HTTP/1.1" 500 5 "-" "curl/7.38.0" "-"
my_nginx_1  | 2019/05/26 09:40:51 [error] 8#8: *1 FastCGI sent in stderr: "PHP message: PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';' in /app/index.php on line 4" while reading response header from upstream, client: 172.22.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://172.22.0.2:9000", host: "0.0.0.0:1080"
my_php_1    | [26-May-2019 09:40:51] WARNING: [pool www] child 8 said into stderr: "NOTICE: PHP message: PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';' in /app/index.php on line 4"
my_php_1    | 172.22.0.3 -  26/May/2019:09:42:49 +0000 "GET /index.php" 200
my_nginx_1  | 172.22.0.1 - - [26/May/2019:09:42:49 +0000] "GET / HTTP/1.1" 200 12 "-" "curl/7.38.0" "-"
my_nginx_1  | 172.22.0.1 - - [26/May/2019:09:42:56 +0000] "GET /no.php HTTP/1.1" 404 153 "-" "curl/7.38.0" "-"

docker-compose.yaml

version: "3.4"

services:

 my_php:
   build:
     context: "./php"
   volumes:
     - "..:/app"

 my_nginx:
   build:
     context: "./nginx"
   ports:
     - "1080:80"
   volumes:
     - "..:/app"
   depends_on:
     - "my_php"

PHP

Dockerfile

FROM php:7.2.13-fpm-alpine3.8

WORKDIR /app

COPY php.ini /usr/local/etc/php/conf.d/php.override.ini
COPY www.conf /usr/local/etc/php-fpm.d/www.conf

CMD ["php-fpm", "--nodaemonize"]

php.ini

[PHP]
date.timezone=UTC
log_errors=On
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors=Off
max_execution_time=60
memory_limit=256M

www.conf

[global]
daemonize=no

[www]
user=www-data
group=www-data

listen=my_nginx:9000

pm=dynamic
pm.max_children=40
pm.start_servers=2
pm.min_spare_servers=2
pm.max_spare_servers=4
pm.max_requests=500

NGINX

Dockerfile

FROM nginx:1.15.8-alpine

WORKDIR /app

COPY app.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf

應用程序配置文件

server {
   listen 80 default_server;

   server_name localhost;

   root /app;

   index index.php;

   location ~ \.php$ {
       try_files $uri =404;
       fastcgi_pass my_php:9000;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
   }
}

nginx.conf

user nginx;

worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
   worker_connections 1024;
}

http {
   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

   access_log /var/log/nginx/access.log main;

   sendfile on;

   keepalive_timeout 65;

   include /etc/nginx/conf.d/*.conf;
}

引用自:https://serverfault.com/questions/961807