nginxのリバースプロキシでキャッシュする

メモ。nginxのリバースプロキシでファイルをキャッシュする方法。
設定したページはこれ。バックエンドはGoogleAppEngine。
http://www.nullpobug.com/
試したnginxのバージョンは0.7。Ubuntu10.04のなので古い。

nginxの設定

nginx.confの中でconf.dやsites-enabledがincludeされるようになってることが前提。

/etc/nginx/conf.d/proxy_cache.conf
proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key:16m max_size=100m inactive=120m;
proxy_temp_path /var/cache/nginx/tmp;

httpディレクティブにproxy_cache_pathを設定する。levelsは、キャッシュファイルをサブディレクトリで保存する設定。
この例の場合、my-keyというキーの領域で共有メモリは16MB使用、キャッシュ全体のサイズは100MB、120分間アクセスが無ければキャッシュは削除される。
proxy_temp_pathで一時ディレクトリを設定する。対象のディレクトリはあらかじめ作成し、nginxのworkerプロセスがアクセスできるようにしておく。

/etc/nginx/sites-available/my-site
server {
        listen   80;
        server_name  www.example.com;
        proxy_set_header X-Real-IP $remote_addr;

        access_log  /var/log/nginx/my-site.access.log;
        error_log  /var/log/nginx/my-site.error.log;

        location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_ignore_headers Cache-Control;
                proxy_cache my-key;
                proxy_cache_valid 200 302 60m;
                proxy_cache_valid 404 10m;
        }
}

サイトごとの設定では、proxy_cacheでkeys_zoneに指定した名前、proxy_cache_validでキャッシュ対象と有効な時間を指定する。
この例では、レスポンスのステータス番号が200と302の場合は60分、404の場合は10分としている。
リバースプロキシ先のレスポンスにCache-Controlヘッダがついていて、"no-cache"とされているとキャッシュされないので、その場合はproxy_ignore_headersで無効化する。

nginxの設定をリロードする

$ sudo /etc/init.d/nginx reload