【Apache】httpd.confのログ設定を理解してみた!初心者向け解説
こんにちは!nishiです。
今回は、Apache(Webサーバー)の設定ファイルである`httpd.conf`のログ設定について、自分なりに調べてまとめてみました。
私の場合はOracle HTTP Serverというコンポーネントシステム(Apacheベースのサーバー)を利用しているので、その設定ファイルである`httpd.conf`の中身を見てたら分かんないことだらけだったので、その調査記録といった意味合いが強いです。
初めは「何これ?」という状態でしたが、1つずつ紐解いていくと、なるほど!と理解できたので、同じように悩んでいる方の参考になれば幸いです。
きっかけ
とある案件で`httpd.conf`ファイルを確認していた時、以下のような設定を見つけました。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\" \"%{JSESESSIONID}C\" (%{deflate_compression_ratio}n) [%D]" deflate
SetEnvIf Request_URI "/HealthCheck$" dontlog
「うわ、なんかすごい記号がいっぱい...」という感じで、最初は全然意味が分かりませんでした。そこで、1つ1つ調べてみることにしました。
設定の意味を解読してみよう!
①LogFormatって何?
まず、`LogFormat`は「アクセスログをどんな形式で記録するか」を定義するものだと分かりました。
②各記号の意味と実際のログ
最初は暗号みたいに見えた記号たちですが、実際のログと照らし合わせながら見てみましょう!
# 設定ファイルの記述
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\" \"%{JSESESSIONID}C\" (%{deflate_compression_ratio}n) [%D]" deflate
# 実際のログ出力例
192.168.1.100 - - [25/Oct/2023:10:15:30 +0900] "GET /index.html HTTP/1.1" 200 2048 "http://example.com" "Mozilla/5.0..." "10.0.0.1" "ABC123" (0.75) [1500]
それぞれの部分を対応させながら、各記号の意味を1つずつ見ていきましょう:
・設定の記号:%h
→意味:アクセス元のIPアドレス (実際のログでの例)192.168.1.100
・設定の記号:%l
→意味:リモートログ名(通常は - で表示) (実際のログでの例)-
・設定の記号:%u
→意味:ユーザー名(通常は - で表示) (実際のログでの例)-
・設定の記号:%t
→意味:アクセスした日時
(実際のログでの例)[25/Oct/2023:10:15:30 +0900]
・設定の記号:\"%r\"
→意味:リクエストの内容(HTTPメソッド、URL、HTTPバージョン)
(実際のログでの例)"GET /index.html HTTP/1.1"
・設定の記号:%>s
→意味:HTTPステータスコード(200は処理成功を意味します)
(実際のログでの例)200
・設定の記号:%b
→意味:送信したデータのサイズ(バイト単位)
(実際のログでの例)2048
・設定の記号:\"%{Referer}i\"
→意味:どのページからアクセスしてきたか(リファラー情報)
(実際のログでの例)"http://example.com"
・設定の記号:\"%{User-Agent}i\"
→意味:使用したブラウザの情報
(実際のログでの例)"Mozilla/5.0..."
・設定の記号:\"%{X-Forwarded-For}i\"
→意味:プロキシ経由時の元のIPアドレス
(実際のログでの例)"10.0.0.1"
・設定の記号:\"%{JSESESSIONID}C\"
→意味:ユーザーのセッションID
(実際のログでの例)"ABC123"
・設定の記号:(%{deflate_compression_ratio}n)
→意味:データの圧縮率
(実際のログでの例)(0.75)
・設定の記号:[%D]
→意味:リクエスト処理にかかった時間(マイクロ秒)
(実際のログでの例)[1500]
このように見ると、1行のログから以下のことが分かります:
192.168.1.100というIPアドレスから
2023年10月25日の10時15分30秒に
/index.htmlというページに
処理は成功(200)し
2048バイトのデータを送信
処理には1500マイクロ秒かかった
このように見ていくと、1行のログから「誰が」「いつ」「どのように」アクセスしたのかが詳しく分かるようになっています。
最初は複雑に見えた設定も、1つずつ見ていくと「なるほど!」と理解できますね😊
【簡単にまとめ】
`%h` : アクセスしてきたパソコンのIPアドレス
`%t` : アクセスした日時
`%r` : どんなページにアクセスしたか
`%b` : 送ったデータの大きさ
`User-Agent` : どんなブラウザを使ったか
`JSESESSIONID` : ユーザーを識別するためのID
`[%D]` : 処理にかかった時間
③HealthCheckって?
SetEnvIf Request_URI "/HealthCheck$" dontlog
この設定は、システムの生存確認(ヘルスチェック)用のアクセスはログに記録しない、という意味でした。
なるほど、確かに毎分のように行われるヘルスチェックをログに記録していたら、ログが埋もれちゃいますもんね!
まとめ
最初は難しそうに見えた設定も、1つ1つ紐解いていくと、「サーバーへのアクセスを上手に記録するための工夫」が詰まっていることが分かりました。
アクセス状況を詳しく記録
問題が起きた時の調査に役立つ
無駄なログは記録しない
皆さんも難しい設定を見かけたら、怖がらずに1つずつ理解していってくださいね!
いかがでしたか?普段の仕事で見かけた設定ファイルの謎解きを、誰かの役に立つ情報として共有できて嬉しく思います。もし同じように「これ何だろう?」と思うことがあれば、ぜひ調べてみてくださいね!