最近のレンタルサーバやVPSは、ネットワーク転送量無制限のサービスがほとんどのため、あまり転送量を気にすることが少なくなりましたが、ネットワーク転送量で従量課金するAWSや、CDN、クラウド型のロードバランサーを利用する際に、費用見積のため、転送量を調べたい場合が時々あります。そこで今回は、Apacheのアクセスログから、ネットワーク転送量を計測する方法をまとめてみました。
Apahce2.x の %b %B フォーマットは転送量あらず!
Apache のアクセスログフォーマットで、よく使われている「combined」の「%b」を計測すれば、、と思いましたが、これはレスポンスのバイト数で、HTTPヘッダの転送量は除かれているそうです。
combined ログフォーマット
Apache のマニュアルを確認してみると、バージョン2.0から「%b」と「%B」の仕様が変わり、実際に転送されたバイト数を記録するには「%O」(mod_logio が必要) を使ってね!とのこと、私は Apahce2.x に移行してから数年経ちますが、いまさら知りました(^^;)
httpd 2.0 では 1.3 とは異なり、%b と %B フォーマット文字列はクライアントに送信されたバイト数そのものではなく、 HTTP レスポンスのバイト数です (これらは異なるもので、たとえば、 コネクションが途中で破棄された場合や、SSL 使用時に一致しません) 。 mod_logio で提供されている %O フォーマット文字列で、ネットワーク経由で実際に転送されたバイト数を 記録できます。
http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#format-notes より引用
HTTP/2 では %O が正しく動作しない(現在は修正済み)
余談ですが、色々調べていたら気になる記事を見つけました。Apache で HTTP/2 通信をしている場合、この「%O」(mod_logio) が正しく動作しないようです。この記事を書いている方が、バグレポートを出されているようなので、アップデートで修正されることを期待します。
apache 2.4.17以降でmod_http2有効にすると、送信バイト数が正しく記録されない? | Soukaku's HENA-CHOKO Blog
Apahce のログ設定 (mod_logio)
設定の前に「%O」フォーマット文字列を使うのに必要な「mod_logio」モジュールが有効になっているかを確認します。Apahceをパッケージからインストールしていれば、ほとんどの場合有効になっていると思います。
logio_module (shared) ←有効になっている
「combinedio」ログフォーマットに「%O」が含まれていますので、今回はこちらを設定します。もし httpd.conf に「combinedio」ログフォーマットが無い場合は、下記を追記しておきましょう。
vim /etc/httpd/conf/httpd.conf
アクセスログのフォーマットを「combinedio」に変更します。
sudo vim /etc/httpd/conf/httpd.conf
↓
CustomLog logs/access_log combinedio
設定を再読込みします。
Apahce のログ設定は以上です。
ネットワーク転送量を集計
ある程度ログが溜まったら awk コマンドなどで、%O列のネットワーク転送量を集計します。集計する列位置の指定は、%O列の前にある User-Agent の列に、区切り文字の空白が含まれるため、列番号ではなく、一番最後の列の数を表す「$NF」で指定すると良いでしょう。
以下は、あるWEBサイトの1日の転送量です。(単位はバイトです)
1742278570
一方、HTTPヘッダの転送量を含まない「%b」は、1742278570 - 1632717474 = 約110MB転送量が少なく記録されていることが分かります。すなわち、これがHTTPヘッダの転送量になりますね。
1632717474
終わりに
今回は、CDN費用を見積るため、ファイルタイプごとの転送量を集計する必要がありましたので、簡単なPHPスクリプトを作成しました。もしよければ使ってみて下さい。
https://github.com/sizaki30/ApacheTrafficMeasurement
コメント
%Oの件、Debianの方にしかバグレポート上げてなかったので、Apacheのほうにも上げておきました。
https://bz.apache.org/bugzilla/show_bug.cgi?id=58871
>双角さん
コメントありがとうございます。
早くバグフィックスされるといいですね。
2.4.19以降で修正されることになりそうです。
https://bz.apache.org/bugzilla/show_bug.cgi?id=58871#c1
ご情報ありがとうございます。
アップデートが楽しみですね。