php-fpmアクセスログのおすすめ設定(www.conf)


LEMP環境&Laravel だと、php-fpmのデフォルト設定では、アクセスログに必要な情報が出力されないので、
ログに出力できるパラメータをすべて実際に出力検証し、これはあったほうがいいなというものをまとめました。

アウトライン

  • 環境情報
  • デフォルトaccess.logフォーマット
  • おすすめaccess.logフォーマット
  • 解説
  • 番外編

環境情報

  • Centos7
  • php7.4
  • Laravel 6.0
  • nginx1.16.1
  • 対象設定ファイル:www.conf (php-fpm)

デフォルトのaccess.logフォーマット

以下はデフォルトの設定内容になります。

www.conf
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

※アクセスログフォーマットに設定可能なパラメータの簡易解説
 %C : CPU 使用率
  %d : リクエストの処理にかかった時間
  %e : 環境変数($ _ENV / $ _SERVER)
  %f : script filename
  %l : content-length of the request (for POST request only)
  %m : request method
  %M : PHPで使用したメモリのピーク
 %n : pool name
  %o : output header
  %p : PID of the child that serviced the request
  %P : PID of the parent of the child that serviced the request
  %q : クエリストリング
  %Q : the '?' character if query string exists
  %r : the request URI (without the query string, see %q and %Q)
  %R : remote IP address
  %s : status (response code)
  %t : server time the request was received
  %T : time the log has been written (the request has finished)
  %u : remote user

実際にこの設定で出力される結果はこちら↓

192.168.1.1 - 1/Aug/2020:01:01:01 +0000 "GET /index.php" 200 /var/www/html/test.com/public/index.php 1111 12211 30.11%

これだと、ログ調査をする際、以下の問題点があります。

  • どの画面にアクセスがあったかわからない (出力されるパスは全て/var/www/html/test.com/public/index.php
  • 複数ホスト管理している場合、どのホストへアクセスされたものかわからない(全部ごっちゃになる)
  • リクエスト完了までにかかった時間が「ミリ」単位で見づらい

おすすめaccess.logフォーマット

そのため、色々試した結果、以下のようにフォーマットに変更しました。

www.conf
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{HTTP_HOST}e %{REQUEST_URI}e %q %{seconds}d %{kilo}M %C%% %{HTTP_REFERER}e"

このフォーマットで実際に出力される結果はこちら↓

192.168.1.1 - 1/Aug/2020:01:01:01 +0000 "GET /index.php" 200 /var/www/html/test.com/public/index.php test.com:443 /test/home 1.111 12211 30.11% https://test.com:443/test/login

以下で解説します。

解説

追加・編集したパラメータは以下の5つになります。

パラメータ 説明 出力例
%{HTTP_HOST}e 現在のリクエストのHost:ヘッダ test.com:443
%{REQUEST_URI}e ページにアクセスするために指定されたURI /test/home
%q クエリストリング a=1
%{seconds}d リクエストの処理にかかった時間を秒数で表示 1.111
%{HTTP_REFERER}e 現在のページに遷移する前にユーザーが閲覧していたページのURL https://test.com:443/test/login

上でも説明がありましたが、「%e」で$_SERVER変数の値が取得できるので主にこちらを使用しました。
実際に出力してみた感じですと、使えそうな$_SERVER変数は上記ぐらいでしたが、お好みで追加してみてください。



まとめると、
上記5つのパラメータを追加・編集することで、
どのホスト・画面にアクセスがあったか、リクエスト処理に何かかったか
さらには、遷移する前の滞在画面までわかるようになりました。

これでサービス運用していくうえで少しは助かるかと思います。
是非参考にしてください

番外編

その他のパラメータで、使えそうだなと思ったけど、実際出力してみて
使えないと判断したパラメータ達です。

パラメータ 説明 出力例
%r 説明では「the request URI」だが、ユーザーがアクセスしたURIではなかった。 /index.php
%R クライアントIPではなく、nginxサーバーのIPを取ってくるため今回は使えない。
IPに関してはnginxの方で取得すればOK。
192.168.1.1
%{REMOTE_ADDR}e %Rと同じ理由 192.168.1.1