nginx + proxy cache

nginxでプロキシキャッシュの方法を書きます。

レスポンスのボディを任意のディレクトリ内に保存し、次回以降のアクセスから保存したデータを返すという仕組みです。
これを使うと負荷の面でだいぶ助けられます。


では実際の使い方を示します。

http {
    proxy_cache_path /var/www/nginx/cache/sample levels=1 keys_zone=cache-sample:64m max_size=5m inactive=7d;
    proxy_temp_path  /var/www/nginx/tmp;

    server {
        location / {
            if ($request_method = POST) {
                alias /var/www/html;
                break;
            }

            proxy_cache cache-sample;
            proxy_cache_valid  200 1d;
            proxy_cache_key $scheme://$host$request_uri;

            alias /var/www/html;
        }
    }
}

細かく説明しますと

proxy_cache_path /var/www/nginx/cache/sample levels=1 keys_zone=cache-sample:4m max_size=5m inactive=7d;
proxy_temp_path  /var/www/nginx/tmp;

ここではキャッシュの設定をしています。
server{}の外に書かないといけません。

proxy_cache_path [キャッシュするディレクトリ] levels=[保存するサブディレクトリの階層] keys_zone=[キャッシュのゾーン]:[キャッシュ格納メモリ数] max_size=[ゾーン内に保存できるキャッシュの最大値] inactive=[キャッシュを保持する時間];

proxy_cache_pathはこのように設定します。
proxy_cache_pathは複数作ることができますので、ディレクトリやゾーン単位で作りましょう。

proxy_temp_pathに関してはそんなに意識しなくて大丈夫です。
名前の通り一時的なものをおくので、適当なディレクトリを用意しましょう。


if ($request_method = POST) {}

この部分はメソッドPOSTの場合はキャッシュしない、返さないようにしています。
アプリの設計しだいですけど、POSTでキャッシュを返すことはまずないと思います。


proxy_cache cache-sample;
proxy_cache_valid  200 1d;
proxy_cache_key $scheme://$host$request_uri;

ここが実際にキャッシュを返す設定をしている部分です。

proxy_cache [キャッシュゾーン指定];
proxy_cache_valid  [ステータスコード] [キャッシュさせる時間];
proxy_cache_key [キャッシュのキー];

という風に設定します。
proxy_cacheには上の方で、proxy_cache_pathで設定したkeys_zoneを書きます。
proxy_cache_keyなんですが、$scheme://$host$request_uriで引数付きのurlをキーにします。
$scheme://$host$uriとすれば引数なしです。
引数でレスポンスを変わる、変わらないを判断して設定を変えましょう。

あとはnginxをリスタートすればキャッシュされるようになると思います。


試しに、

$ vim /var/www/html/index.html
test

として、http://localhost/にアクセスしてみてください。
次に

$ vim /var/www/html/index.html
sample

として先ほどと同じようにアクセスして、testと出ていれば成功です。


今度はキャッシュの削除方法を説明します。
といってもこれは簡単で、キャッシュされているディレクトリを削除すればいいだけです。
今回の例でいうと

$ rm -fr /var/www/nginx/cache/sample

これだけです。


nginx + proxy cache - 城好きwebプログラマーの生態メモ - 仕事編