php-fpmのアクセスログにリクエストされたURIを書き込む

backcheck事業部の前田です。
今回は簡単なTips程度の話です。
結論だけ見たい人は結果の見出しへ

問題

私はよくnginx+php-fpmの構成で、Laravelを使います。
その際に、php-fpm側でもアクセスログを出しているのですが、デフォルトの設定だと以下のようになります。

172.18.0.7 -  31/Jul/2020:14:48:45 +0900 "GET index.php" 200
172.18.0.7 -  31/Jul/2020:14:48:47 +0900 "GET index.php" 200
172.18.0.7 -  31/Jul/2020:14:48:58 +0900 "PATCH index.php" 204

まぁ、すべてのリクエストを意図的にindex.phpに集めてるから、そうなるよねー・・・・という話です。
ただ、実際の運用では「どのファイルにアクセスしたか」よりも、「どのURIでアクセスしたか」が知りたいと思います。
なので、ここの index.php の部分を実際にリクエストされたURIに変更したいと思います。

アクセスログのフォーマット指定

さて、URIをログに書き込むためには、ログのフォーマット形式を変更する必要がありそうです。
php-fpmのアクセスログのフォーマット指定は、php-fpmの設定ファイルで指定できます。

https://www.php.net/manual/ja/install.fpm.configuration.php#access-format

ここで、ログ形式のデフォルト値は

"%R - %u %t \"%m %r\" %s"

と書かれています。が、なんと肝心の各記号の意味が書かれていません!!
色々と探してみると、php-fpmのデフォルトの設定ファイルの中に書かれているようでした。

github.com

説明が大量にあるので、デフォルトのログの部分の説明だけ拾ってみます。

; %R: remote IP address
; %u: remote user
; %t: server time the request was received
;   it can accept a strftime(3) format:
;   %d/%b/%Y:%H:%M:%S %z (default)
;   The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
;   e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
; %m: request method
; %r: the request URI (without the query string, see %q and %Q)
; %s: status (response code)

・・・ということで、 %rindex.php に該当していることがわかります。
ここを、リクエスURIに置き換えれば良さそうです。

リクエスURIの取得

置き換える場所がわかったので、リクエスURIはどのように取得すれば良いかを調べます。
先ほどの各記号の説明をざっと読んでもそれらしきものは見当たらなかったのですが、じっくり読むと、以下が使えそうです。

; %e: an environment variable (same as $ENV or $SERVER)
;   it must be associated with embraces to specify the name of the env
;   variable. Some examples:
;   - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
;   - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e

リクエスURI$_SERVER['REQUEST_URI'] に入っているので、 %{REQUEST_URI}e と書けば良さそうです。

結果

まとめると、以下のような修正を行いました。

[www]
;access.format = "%R - %u %t \"%m %r\" %s"
access.format = "%R - %u %t \"%m %{REQUEST_URI}e\" %s"

そしてログを確認すると・・・

172.18.0.7 -  31/Jul/2020:14:48:45 +0900 "GET /api/posts" 200
172.18.0.7 -  31/Jul/2020:14:48:47 +0900 "GET /api/posts/5/comments" 200
172.18.0.7 -  31/Jul/2020:14:48:58 +0900 "PATCH /api/posts/5/comments/12" 204

無事にアクセスログにリクエスURIを残せました!!🎉🎉🎉