アクセスログ設定

誰が何を見に来たかは、ログにしか残らない

リクエストが来るたびに、nginx は1行ずつ記録を残します。既定では全部が同じファイルに集まります。

tail -2 /var/log/nginx/access.log # 127.0.0.1 - - [08/Aug/2026:12:30:11 +0000] "GET / HTTP/1.1" 200 512 "-" "curl/7.88.1"

1行の中身は、接続元、時刻、リクエストの中身、ステータスコード、返した大きさ、と並んでいます。この並びには combined という名前が付いていて、Web サーバーの世界ではほぼ共通の形式です。集計の道具がこの並びを前提に作られているのは、そのためです。

サイトごとに分けて出す

1台で複数のサイトを配信していると、全部のログが混ざって集計しにくくなります。server ブロックごとに出力先を変えられます。

access_log /var/log/nginx/mysite-access.log;

これを server ブロックの中に書けば、そのサイトへのリクエストだけが別のファイルに溜まります。

並びに項目を足す

記録する項目は自分で決められます。定義するのは log_format です。

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

先頭の mysite が、この形式に付けた名前です。使うときは出力先のうしろに名前を書きます。

access_log /var/log/nginx/mysite-access.log mysite;

最後に足した $request_time は、そのリクエストに何秒かかったかです。遅いページを探すときに効きます。既定の combined には入っていないので、自分で足す価値があります。

並び順は勝手に変えない

ここが今回の勘どころです。項目はうしろに足すのであって、途中に差し込んではいけません。

Linux 入門で書いた log-report.sh を思い出してください。

awk '{print $7}' "$LOG" | sort | uniq -c | sort -rn | head -10

7番目の項目を取り出しています。combined の並びでは、そこがリクエストされたパスにあたります。もし前のほうに項目を1つ差し込むと、7番目は別のものになり、この集計は静かに嘘をつき始めます。エラーにならないぶん、たちが悪い壊れ方です。

既存の並びは動かさず、うしろに足す。これを守れば、これまで書いた道具はそのまま使い続けられます。

log_format を書く場所

log_format は server ブロックの中には書けません。もっと外側の http の階層に置くという決まりがあります。Debian の構成では conf.d に置くのがきれいです。

vi /etc/nginx/conf.d/mysite-log.conf

nginx.confconf.d/*.conf を読み込んでいたことを、3章の最初で確かめました。あの include がここで効いてきます。

手を動かす

自分のサイト専用のログを、項目を1つ足した形式で出るようにします。そのうえで、入門で書いた集計スクリプトが新しいログでも動くことを確かめます。

ヒント

  • 1. /etc/nginx/conf.d/mysite-log.conf に log_format mysite を定義する。末尾に $request_time を足す
  • 2. mysite.conf の server ブロックに access_log /var/log/nginx/mysite-access.log mysite; を書く
  • 3. nginx -t のあと systemctl reload nginx で反映する
  • 4. curl で / と /style.css と /works/ を何度か叩く
  • 5. /root/bin/log-report.sh /var/log/nginx/mysite-access.log の出力を /root/log-report.txt に保存する

7 項目で採点します