NGINX コンテントのキャッシング


NGINX コンテントのキャッシング

この章では、プロキシされたサーバから受け取った応答のキャッシングを有効にする方法と設定方法を説明します。キャッシングが有効になると、NGINXはディスク上のキャッシュの中に応答を保存し、リクエストをプロキシせずにそれらを使ってクライアントに応答します。

応答のキャッシュを有効にする

proxy_cache_path ディレクティブを使って、キャッシュのパスと他のパラメータをキャッシュするように設定することができます。キャッシュを有効にしたいコンテキストの中でproxy_cache を配置します。

http {
    ...
    proxy_cache_path /data/nginx/cache keys_zone=one:10m;

    server {
        proxy_cache one;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

proxy_cache_path ディレクティブはhttpレベルだけで指定できることに注意してください。二つの必須パラメータがあります: キャッシュされた応答が格納されるファイルシステムのパス、共有メモリ領域の名前とサイズは keys_zone パラメータで定義されます。同じ名前がproxy_cache ディレクティブ内で指定されます。

共有メモリ領域はキャッシュアイテムのメタデータを保持するために使われます。しかしながら、サイズはキャッシュ応答のトータルのサイズを制限しません。キャッシュされた応答そのものはファイルシステム上の指定されたファイル内にメタ情報のコピーと一緒に保存されます。このファイルストレージのサイズはmax_sizeパラメータを使って制限することができます。しかしながら、ファイルストレージの実際のサイズは、キャッシュサイズをチェックし一番使われていないキャッシュ応答とそれらのメタデータを削除するcache manager が呼ばれるまでは、一時的にこれを超えることがあります。

キャッシュ処理

キャッシングに関わる更に二つのNGINXプロセスがあります。cache loadercache manager です。

cache manager は定期的にキャッシュストレージの状態をチェックするために呼び出されます。特に、ファイルストレージのサイズがmax_sizeパラメータを超えた時に最も使われていないデータを削除します。

cache loader はNGINXが起動した直後に、一度だけ起動されます。以前にキャッシュされたデータについてのメタ情報を共有メモリ領域にロードします。全てのキャッシュを一度にロードすることは、かなり大量のリソースを消費し、最初の数分はnginxのパフォーマンスが低下するかも知れません。cache loaderproxy_cache_pathディレクティブのパラメータで指定された回数だけ繰り返し動作するのはそのためです。

それぞれの繰り返しはloader_thresholdで指定されたミリ秒(デフォルトは200)を超えない間だけ続きます。一回の繰り返しの間に、キャッシュローダはloader_files で指定された個数(デフォルトは100)を超えない分だけロードします。繰り返しの間の休止はloader_sleepsのミリ秒単位(デフォルトは50)で設定されます。例えば、これらのパラメータはキャッシュメタデータのロードを高速化するために変更することができます。

proxy_cache_path /data/nginx/cache keys_zone=one:10m
                 loader_threshold=300 loader_files=200;

どのリクエストをキャッシュするかを指定する

デフォルトでは、NGINXはプロキシされているサーバから受け取った初回の応答でのGETHEADメソッドの全ての応答をキャッシュします。リクエストのキー識別子として、NGINXはリクエスト文字列を使います。二つのリクエストが同じキーを持つと等しいものと見なされ、同じキャッシュされた応答がクライアントに送られます。proxy_cache_key ディレクティブは、リクエストのためにキーが計算される方法を定義し、その方法はlocation、server または http レベルで変更できます:

proxy_cache_key "$host$request_uri$cookie_user";

proxy_cache_min_uses ディレクティブを使って同じキーのリクエストをキャッシュする最小回数を増加させることができます。

proxy_cache_min_uses 5;

また、キャッシュするリクエストの追加のHTTPメソッド指定することもできます:

proxy_cache_methods GET HEAD POST;

この設定は、GET, HEAD または POST メソッドをもつリクエストへの応答のキャッシュを可能にします。

キャッシュの制限と通過

デフォルトでは応答がキャッシュされる時間は無制限です。キャッシュのファイルストレージが超過した時に、もしそのキャッシュが他のキャッシュよりも使われていないものであれば削除されるでしょう。そうでなければ、応答は永遠にキャッシュに保持され得ます。

proxy_cache_valid ディレクティブを使って、指定のステータスコードのレスポンスが有効な時間を制限することができます:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

上の例では、200と302コードのレスポンスはキャッシュの中では10分間有効になり、404コードは1分間有効になります。全てのステータスコードに適用されるストレージの時間制限を設定するには、anyを最初のパラメータに設定します:

proxy_cache_valid any 5m;

(たとえキャッシュに存在したとしても)キャッシュから取り出されない時の応答の状態を定義するには、 proxy_cache_bypass ディレクティブを利用します。デフォルトでは何の状態も定義されていないことに注意してください。ディレクティブは一つ以上のパラメータを持つかも知れません。それぞれのパラメータは多数の変数からできているかも知れません。少なくとも一つのパラメータが空ではなく、"0"でも無ければ、NGINXはキャッシュから応答を探さないでしょう。例えば:

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

キャッシュに応答が全く保存されない条件を定義するには、proxy_no_cache ディレクティブを使います。条件はproxy_cache_bypassと全く同じルールで定義されます:

proxy_no_cache $http_pragma $http_authorization;

設定の組み合わせの例

次の設定の例では、上で説明したキャッシュオプションとは幾つか異なるものを組み合わせています。

http {
    ...
    proxy_cache_path /data/nginx/cache keys_zone=one:10m
                     loader_threshold=300 loader_files=200
                     max_size=200m;

    server {
        listen 8080;
        proxy_cache one;

        location / {
            proxy_pass http://backend1;
        }

        location /some/path {
            proxy_cache_valid any   1m;
            proxy_cache_min_uses 3;
            proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
            proxy_pass http://backend2;
        }
    }
}

この例では、二つのlocationを持ち、同じキャッシュを利用しているが設定が異なるバーチャルサーバを定義します。

backend1 サーバからの応答はほとんど変わることが無く、最初にリクエストを受け取ったときにキャッシュすることができ、できる限りながく保持すると仮定しています。

反対に、backend2 サーバからの応答は頻繁に変わりやすく、従って同じリクエストをキャッシュするのは3度だけで1分だけ保持されます。その上、リクエストがproxy_cache_bypass ディレクティブの条件を満たす場合は、その応答のキャッシュは全く検索されず、NGINXはただちにリクエストをバックエンドに送信します。

TOP
inserted by FC2 system