Apache ネットワーク転送量を計測

Linux
Linux
スポンサーリンク

最近のレンタルサーバやVPSは、ネットワーク転送量無制限のサービスがほとんどのため、あまり転送量を気にすることが少なくなりましたが、ネットワーク転送量で従量課金するAWSや、CDN、クラウド型のロードバランサーを利用する際に、費用見積のため、転送量を調べたい場合が時々あります。そこで今回は、Apacheのアクセスログから、ネットワーク転送量を計測する方法をまとめてみました。

Apahce2.x の %b %B フォーマットは転送量あらず!

Apache のアクセスログフォーマットで、よく使われている「combined」の「%b」を計測すれば、、と思いましたが、これはレスポンスのバイト数で、HTTPヘッダの転送量は除かれているそうです。

combined ログフォーマット

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 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をパッケージからインストールしていれば、ほとんどの場合有効になっていると思います。

# httpd -M | grep logio_module
 
logio_module (shared) ←有効になっている

「combinedio」ログフォーマットに「%O」が含まれていますので、今回はこちらを設定します。もし httpd.conf に「combinedio」ログフォーマットが無い場合は、下記を追記しておきましょう。
vim /etc/httpd/conf/httpd.conf

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

アクセスログのフォーマットを「combinedio」に変更します。
sudo vim /etc/httpd/conf/httpd.conf

CustomLog logs/access_log combined
              ↓
CustomLog logs/access_log combinedio

設定を再読込みします。

sudo systemctl reload httpd

Apahce のログ設定は以上です。

ネットワーク転送量を集計

ある程度ログが溜まったら awk コマンドなどで、%O列のネットワーク転送量を集計します。集計する列位置の指定は、%O列の前にある User-Agent の列に、区切り文字の空白が含まれるため、列番号ではなく、一番最後の列の数を表す「$NF」で指定すると良いでしょう。

以下は、あるWEBサイトの1日の転送量です。(単位はバイトです)

cat /var/log/httpd/access_log | awk '{TRAFFIC += $NF} END {print TRAFFIC}'
1742278570

一方、HTTPヘッダの転送量を含まない「%b」は、1742278570 - 1632717474 = 約110MB転送量が少なく記録されていることが分かります。すなわち、これがHTTPヘッダの転送量になりますね。

cat /var/log/httpd/access_log | awk '{TRAFFIC += $10} END {print TRAFFIC}'
1632717474

終わりに

今回は、CDN費用を見積るため、ファイルタイプごとの転送量を集計する必要がありましたので、簡単なPHPスクリプトを作成しました。もしよければ使ってみて下さい。
https://github.com/sizaki30/ApacheTrafficMeasurement

コメント

  1. 双角 より:

    %Oの件、Debianの方にしかバグレポート上げてなかったので、Apacheのほうにも上げておきました。

    https://bz.apache.org/bugzilla/show_bug.cgi?id=58871

タイトルとURLをコピーしました