検索
連載

もっとApacheを知ろういまさら聞けない!? Web系開発者のためのサーバ知識(2)(3/3 ページ)

開発者として常にプログラマに徹してしまっていないだろうか。そうすると、どうしてもサーバ知識が不足しがちになる(編集部)

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

アクセスログ

 エラーログと並んで重要なのが、クライアントからのリクエストを記録するアクセスログです。WebアプリケーションはWebブラウザからのアクセスに応答することで成り立っていますので、クライアントがいつ、どこから、どういった方法(リクエストメソッドやパラメータ)で、どのコンテンツを要求してきているのかを確認することは非常に重要になります。

 アクセスログの設定は、LogFormatCustomLogという項目で指定します。LogFormatは文字どおりログの出力書式、CustomLogはログの出力先ファイル名を表します。

 ログの出力書式は、次のような形式で定義します。

LogFormat "ログの書式指定" 書式の名称

 例えば、次のようになります。httpd.confの既存のLogFormatの記述の下に追加してみましょう。

LogFormat "[%h] %t \"%{User-Agent}i\" \"%r\" %>s" my_log_format

 書式指定内の%hや%tなどは、リクエストに関わるさまざまな情報を表す記号です。例えば、%sはアクセス元のホスト(IPアドレス)を表します。%{xxxx}xの部分は、環境変数やリクエストのヘッダの情報を取得するためのものです。%{User-Agent}iは、リクエストヘッダからUser-Agent(アクセス元のクライアントアプリケーションの種類)の情報を取得します。

 書式指定に利用できる記号はたくさんありますので、詳しくは http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formatsを参照してください。

 書式指定の後ろには、ここで定義した書式の名称を指定します。上記では分かりやすくmy_log_formatとしてみました。

 次に、CustomLogにログの出力先ファイル名と、ログ書式(先ほど定義した名称)を指定します。例えば、次のようになります。

CustomLog logs/my_test_log my_log_format

 デフォルトのhttpd.confでは、logs/access_logにcombinedという定義済み書式のログが出力されるように設定されています。その設定の下あたりに、上記のような出力指定を追加し、Apacheを再起動してください。その後、Webブラウザでアクセスし、新たに設定追加したログファイルが出力されているか確認してみましょう。

アクセスに応じて環境変数を設定する

 Apacheでは、リクエストの情報(アクセス元やURLなど)を判定して、その結果に応じて環境変数をセットすることができます。環境変数をセットしておくと、設定ファイル内で別の設定の条件判定などに利用できますし、PHPなどのWebアプリケーションで利用することもできます(アプリケーションとの連携部分は、もう少し後の回で解説します)。

 この設定も、httpd.confに記述します。以下に例を示します。

# アクセス元IPアドレスを判定して環境変数をセット
SetEnvIf Remote_Addr "192\.168\.166\." is_vm
 
# アクセス先URLを判定して環境変数をセット
SetEnvIf Request_URI "(test|test_page)\/.+\.html$" access_type=test

 書式は次のようになっています。

SetEnvIf 判定対象 判定条件(正規表現) 環境変数名[=値]

 判定対象としては、上記の設定例のURL(Request_URI)やアクセス元IPアドレス(Remote_Addr)のほか、ユーザーエージェント(User-Agent)やリファラ(Referer)など、いろいろと指定できます。詳細は http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvifを参照してください。

 具体的な判定条件は、正規表現で指定します。判定対象が、この正規表現にマッチした場合に、環境変数がセットされます。先ほどの1つ目の例のように環境変数名だけを指定した場合、変数には1(True)がセットされます(変数名の前に ! を付けると、逆に環境変数が解除されます)。

 2つ目の例のように「環境変数=値」と記述すれば、任意の値をセットすることもできます。なお、「SetEnvIf」の代わりに「SetEnvIfNoCase」を利用すると、大文字と小文字を区別せずに正規表現のマッチングが行われます。

 続いて、ここで設定した環境変数に応じたログの振り分け出力の方法を紹介しましょう。

アクセスログを目的別に分けて出力したい

 Webブラウザが、あるWebページを表示し終えるまでに実行するサーバへのアクセスは、1回ではありません。画像やCSSやJavaScriptなど、ページに含まれる多くの関連コンテンツを取得するために、Webブラウザは繰り返しサーバへアクセスします。

 こういったさまざまな種類のアクセスを、すべて1つのログファイルに出力していると、重要なログも些末なログもいっしょくたになり、ログ解析が非常にやりにくくなってしまいます。

 先ほど紹介したようにアクセスの内容によって環境変数をセットしておくと、これを条件にログの出力を振り分けることができます。CustomLogの設定の末尾に「env=環境変数名」と記述すると、その環境変数がセットされている場合のみログの出力が行われます。

 「env=!環境変数名」のように!を付けると、その環境変数がセットされていない場合にログの出力が行われます(CustomLogのenvでは、環境変数がセットされているかいないかの判定しか行われないため、ログ出力のフラグと考えるとよいでしょう)。ログの出力内容は、先ほどのLogFormatで定義し、目的別に使い分けると便利です。

 条件付きのログ出力設定の例を見てみましょう。

# 特定のアドレス帯からのアクセスのログを分ける
SetEnvIf Remote_Addr "192\.168\.0\." is_lan
CustomLog logs/lan_log combined env=is_lan
CustomLog logs/access_log combined env=!is_lan
 
# 画像やCSSなどヘのアクセスとコンテンツ本体へのアクセスのログを分ける
SetEnvIfNoCase Request_URI "\.(gif|jpg|jpeg|png|bmp|css|js)$" is_resources_access
SetEnvIfNoCase Request_URI "resize.php" is_resources_access
CustomLog logs/resource_log combined env=is_resources_access
CustomLog logs/access_log combined env=!is_resources_access

 1つ目の例では、アクセス元のアドレス帯がローカルだった場合と外部だった場合とでログファイルを分けています。

 2つ目の例では、まずリクエストURL末尾の拡張子を判定し、画像などのリソースへのアクセスだった場合にフラグをセットしています。また、同じ環境変数のセットは繰り返し記述できますので、画像をリサイズするプログラムを介して画像リソースを取得するアクセスの場合も、同じフラグをセットするようにしています。そして、このフラグのあるなしで、ページ本体へのアクセスログと付随リソースへのアクセスログを分けています。

 今回は、Apacheの自動起動、基本中の基本となる設定項目、およびログの出力設定についてお話ししました。次回も引き続き、Apacheの機能や設定のなかから、開発者に縁の深い部分を紹介したいと思います。

著者紹介

竹下 肯己

株式会社 qnote



Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る