コンテナの中に PHP アプリケーションのログを出力している場合、docker exec
でコンテナの中に入るか、引数に tail -f
を指定してログを確認していたりします。ローカル環境なら面倒でも確認可能ですが、コンテナの中に入れないよう制限されていたり、クラウド環境でそもそもコンテナの中に入れない場合があります。そうなると PHP アプリケーションのログ自体をコンテナの標準出力に出した方が、ローカル環境でもログ確認しやすいし、クラウド環境でもログ連携が簡単になり、良い事ばかりな気がします。そこで今回は、php-fpm コンテナの標準出力に PHP のアプリケーションログを出力する構成を検証してみました。
PHP アプリケーション:index.php
ini_set
で php.ini が環境ごとに設定されている場合を想定。
<?php
ini_set("error_log", "php://stdout");
function logError($message) {
$timestamp = date("Y-m-d H:i:s");
$logMessage = "[$timestamp] $message" . PHP_EOL;
error_log($logMessage);
}
phpinfo();
logError("test message");
?>
nginx 設定フィアル:php.conf
nginx と php-fpm を連携します。
server {
listen 80;
root /var/www/html;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
コンテナの起動コマンド用スクリプト:init.sh
nginx はバックグラウンド起動して、php-fpm はフォアグランド起動します。
#!/bin/bash
set -e
nginx
php-fpm
検証用コンテナ:Dockerfile
nginx をインストールして、不要なファイルを削除したりローカルのファイルをコンテナにコピーしたり。
FROM php:8.2-fpm
RUN apt update && apt install -y nginx
RUN rm /etc/nginx/sites-enabled/default
COPY php.conf /etc/nginx/sites-enabled/
COPY index.php /var/www/html
COPY init.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/init.sh
CMD ["init.sh"]
コンテナをビルドしてローカル検証
# ビルド
docker build -t mnrphp .
# 起動したらブラウザで http://localhost/ にアクセス
docker run -d --rm --name mnrphp -p 80:80 mnrphp
# 標準出力の確認
docker logs mnrphp -f
# コンテナの中に入る場合
docker exec -it mnrphp bash
# 検証が終わったら削除
docker stop mnrphp
標準出力の結果
% docker logs mnrphp -f
[27-Aug-2023 00:56:49] NOTICE: fpm is running, pid 10
[27-Aug-2023 00:56:49] NOTICE: ready to handle connections
127.0.0.1 - 27/Aug/2023:00:56:55 +0000 "GET /index.php" 200
NOTICE: PHP message: [2023-08-27 00:56:55] test message
NOTICE: PHP message: [2023-08-27 00:57:01] test message
127.0.0.1 - 27/Aug/2023:00:57:01 +0000 "GET /index.php" 200
NOTICE: PHP message: [2023-08-27 00:57:02] test message
127.0.0.1 - 27/Aug/2023:00:57:02 +0000 "GET /index.php" 200
参考
https://github.com/docker-library/php/tree/a01c2d9b513441e8ad34a15e31be87ab8d18dfe1/8.2/bookworm/fpm
タグ: Docker, PHP