※現在リダイレクトにて新サイトへ移行中です
parudou
更新日:2018/10/23
Nginxアクセスログのフォーマットにホスト名を入れてLogwatchにも対応させる
Nginxのアクセスログは、ほぼApacheのフォーマットで使っているかと思います。
しかしこのフォーマットは致命的な欠点がある。
バーチャルサーバー(マルチドメイン)にしている場合、ホスト名がわからない。
環境
- ・CentOS Linux release 7.5.1804 (Core)
- ・nginx/1.15.5
- ・Logwatch 7.4.0
- ・さくらVPS
問題点を具体的に
標準のフォーマットは下記です。
2x.xx.xxx.xxx - - [15/Oct/2018:03:11:03 +0900]
"GET /archives/10000 HTTP/1.0" 200 25107 "-"
"Mozilla/5.0 (Android 8.0.0; Mobile; rv:62.0) Gecko/62.0 Firefox/62.0"
"2x.xx.xxx.xxx"
このように、ホスト名(ドメイン名)が無く、どのサイトのことなのかわかりません。
これだとアクセスログを取っている意味がないと言っても過言ではない。
<標準のフォーマット>
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
<ホスト名を追加する>
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$host" "$http_x_forwarded_for"';
3行目の「”$host”」を追加します。
これにより下記のようになる。
2x.xx.xxx.xxx - - [15/Oct/2018:03:11:03 +0900]
"GET /archives/10000 HTTP/1.0" 200 25107 "-"
"Mozilla/5.0 (Android 8.0.0; Mobile; rv:62.0) Gecko/62.0 Firefox/62.0"
"parudou3.com" "2x.xx.xxx.xxx"
なぜこの位置なのか?ですが、
これはアクセスログ収集ツールの「Logwatch(ログウォッチ)」に対応させるためです。
位置により作動しなくなるので、この位置がベスト。
今のところ、何の問題もなく運用できています。
ちなみにエラーログのフォーマットは
2018/10/11 04:06:15 [error] 17392#17392:
*19801096 access forbidden by rule, client: 2x.xxx.xx.xxx,
server: parudou3.com, request: "POST /xmlrpc.php HTTP/1.0",
host: "parudou3.com", referrer: "http://parudou3.com/"
エラーログは標準でホスト名が入っているので大丈夫です。
しかも、Nginxはエラーログのフォーマットを変更できない。
Apacheとも全然違うフォーマットなので、Logwatchにも対応していません。
独自に集計するよう設定しないといけない。
--
アクセスログは重要なもの。
きちんと解析できる状態にしておこう。
なぜかこんな大事なことがあまり語られていないという。
是非ご感想・ご指摘等をください。