dockerの開発環境は便利なのですが、トラブルの発生時にコンテナごとにエラーを確認することになるので、そこは少し不便です。 なので、そこの利便性を上げるためにFluentdを使います。 今回はnginx + pfhp-fpm + fluentdの構成でログを集約してみます。
ディレクトリ構造とファイルの配置の予定
my-app/ ├─dokcer/ │ ├─nginx/ │ │ ├─nginx.conf │ │ └─default.conf │ ├─php-fpm/ │ │ ├─php-extends.ini │ │ └─log.conf │ └─fluentd/ │ └─fluent.conf └─docker-compose.yml
ファイルの作成
nginx.conf
access_log、error_logを設定。 php-fpmとの接続を安定させるためにfastcgi_connect_timeout、fastcgi_read_timeout、fastcgi_send_timeoutを設定。
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; 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; error_log /var/log/nginx/error.log; sendfile on; #tcp_nopush on; keepalive_timeout 300; send_timeout 300; fastcgi_connect_timeout 300; fastcgi_read_timeout 300; fastcgi_send_timeout 300; #gzip on; include /etc/nginx/conf.d/*.conf; }
default.conf
host.access.log、host.error.logを設定。 9000番にきたらphp-fpmへつなげる。
server { listen 80; listen [::]:80; server_name ~^localhost$; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name ~^localhost$; access_log /var/log/nginx/host.access.log; error_log /var/log/nginx/host.error.log; location / { root /var/www/html/public; index index.php index.html index.htm; # リクエストされたファイルが存在しなければ、 # フロントコントローラーに内部リダイレクト try_files $uri /index.php?$query_string; } error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { root /var/www/html/public; fastcgi_pass localhost$:9000; fastcgi_index index.php; # - 全てのリクエストをフロントコントローラーで実行 fastcgi_param SCRIPT_FILENAME $document_root/index.php; include fastcgi_params; } }
php-extends.ini
phpエラーログとタイムゾーンの設定。
[date] date.timezone = "Asia/Tokyo" [php] log_errors = On error_log = /var/log/php-fpm/php.log
log.conf
php-fpmのエラーログを設定。
; The access log file ; Default: not set access.log = /var/log/php-fpm/access.log ; Error log file ; If it's set to "syslog", log is sent to syslogd instead of being written ; into a local file. ; Note: the default prefix is /usr/local/var ; Default Value: log/php-fpm.log error_log = /var/log/php-fpm/error.log
fluent.conf
fluentdでログを受け取る。
そのまま出力する設定。
docckerコンテナのログのタグと、matchを変更することで受け取るログを判別することもできる。
そのまま出力する設定。
docckerコンテナのログのタグと、matchを変更することで受け取るログを判別することもできる。
<source> @type forward port 24224 </source> <match *> @type stdout </match>
docker-compose.ymlの作成
コンテナのloggingでdriverにfluentdを指定することで、fluentdにログを送ることができます。
version: '3' services: nginx: build: nginx:1.23.3 container_name: nginx restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/local.conf:/etc/nginx/conf.d/default.conf logging: # ログ出力先にfluentdを指定 driver: "fluentd" options: # fluentdサーバー fluentd-address: "localhost:24224" # ログに付与するタグ tag: "nginx" fluentd-async-connect: "true" depends_on: - php-fpm - fluent php-fpm: build: php:8.1.16-fpm container_name: php-fpm restart: always volumes: - ./php-fpm/php-extends.ini:/usr/local/etc/php/php-extends.ini - ./php-fpm/log.conf:/usr/local/etc/php-fpm.d/log.conf - ../:/var/www/html logging: # ログ出力先にfluentdを指定 driver: "fluentd" options: # fluentdサーバー fluentd-address: "localhost:24224" # ログに付与するタグ tag: "php-fpm" fluentd-async-connect: "true" fluent: image: "fluent/fluentd:v1.15-debian-1" container_name: fluentd ports: - "24224:24224" - "24224:24224/udp" environment: - 'FLUENTD_CONF=fluent.conf' - 'TZ:Asia/Tokyo' volumes: - ./fluentd/config:/fluentd/etc/
コンテナを起動する
fluentdのログには、nginxとphp-fpmのログを取得する準備ができていることを確認できます。
起動したコンテナのログがfluentdで確認できるようになりました。
起動したコンテナのログがfluentdで確認できるようになりました。
2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: gem 'fluentd' version '1.15.3' 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: using configuration file: <ROOT> 2023-09-25 12:16:25 <source> 2023-09-25 12:16:25 @type forward 2023-09-25 12:16:25 port 24224 2023-09-25 12:16:25 </source> 2023-09-25 12:16:25 <match nginx> 2023-09-25 12:16:25 @type stdout 2023-09-25 12:16:25 </match> 2023-09-25 12:16:25 <match php-fpm> 2023-09-25 12:16:25 @type stdout 2023-09-25 12:16:25 </match> 2023-09-25 12:16:25 </ROOT> 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: starting fluentd-1.15.3 pid=7 ruby="3.1.3" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: spawn command to main: cmdline=["/usr/local/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/local/bundle/bin/fluentd", "--config", "/fluentd/etc/fluent.conf", "--plugin", "/fluentd/plugins", "--under-supervisor"] 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: #0 init worker0 logger path=nil rotate_age=nil rotate_size=nil 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: adding match pattern="nginx" type="stdout" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: adding match pattern="php-fpm" type="stdout" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: adding source type="forward" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: #0 listening port port=24224 bind="0.0.0.0" 2023-09-25 12:16:25 2023-09-25 03:16:25 +0000 [info]: #0 fluentd worker is now running worker=0