Ubuntu で Nginx のキャッシュヒット率を Munin でモニタリング

Nginx をリバースプロキシとして利用していて、さらにキャッシュ設定をしています。実際どれくらいプロキシキャッシュの効果があるのが、Munin で集計して監視してみる設定方法です。

前回は Nginx 自体の状態を監視設定してみました。
Ubuntu で Nginx のステータスを Munin でモニタリング - tilfin's note
この続きです。

munin-monitoring

Munin はいくつかのプラグインを apt-get で入れると追加されてますが、さらにサードパーティ製のプラグインGitHub で管理されています。
munin-monitoring/contrib · GitHub

Rootユーザで今回は /usr/local/munin にリポジトリをクローンします。

$ sudo mkdir /usr/local/munin
$ cd !$
$ sudo git clone https://github.com/munin-monitoring/contrib.git

nginx-cache-hit-rate

リクエストのキャッシュヒット率などを集計するプラグインになります。これを利用します。 nginx-cache-hit-rate スクリプトは contrib/plugins/nginx/nginx-cache-hit-rate に入っています。

nginx-cache-hit-rate スクリプトプラグインディレクトリにシンボリックリンクします。

$ cd /etc/munin/plugins/
$ sudo ln -s /usr/local/munin/contrib/plugins/nginx/nginx-cache-hit-rate

このスクリプトPerl 製でモジュール File::ReadBackwards.pm が必要になります。

CPAN と File::ReadBackwards モジュールのインストール

設定中のさくら VPSUbuntu 12.04 には入っていないため、CPAN からインストールします。 Rootでcpanを実行します。未設定の場合はインタラクティブに初期設定を行います。終了後 cpan のシェルになるため、install コマンドで File::ReadBackwards.pm をインストールします。

$ sudo -i
# cpan
cpan> install File::ReadBackwards.pm
cpan> quit

Nginx 設定

キャッシュヒット率の算出するためのログデータを設定します。 キャッシュデータ専用のログフォーマット cache を nginx.conf の http ブロックに log_format ディレクティブで定義します。

http {

    log_format cache '$remote_addr - $host [$time_local] "$request" $status '
                     '$body_bytes_sent "$http_referer" '
                     'rt=$request_time ut="$upstream_response_time" '
                     'cs=$upstream_cache_status';

}

バーチャルホスト設定ファイルなどの server ブロック内にキャッシュ用 access_log ディレクティブを追加します。これで元のアクセスログはそのままにできます。

server {

        access_log  /var/log/nginx/access.log;
        access_log  /var/log/nginx/cache.log cache;

}

Munin プラグイン設定

/etc/munin/plugin-conf.d/munin-node ファイルに nginx* セクションに env.logfile としてキャッシュファイルへのパスを定義を追加します。ログファイルのリード可能なユーザを user に定義します。

[nginx*]
user www-data
env.logfile /var/log/nginx/cache.log

グラフについて

サービスを再起動してブラウザで確認すると、NGINX hit rates セクションが増えます。

  • Hits - キャッシュヒットしたもの
  • Misses - ヒットしなかったもの
  • Expired Objects - キャッシュが期限切れだったもの

upstream(バックエンド)に行かないリクエストも含めて総数としているため、100%とは限りません。