proxyキャッシュを設定した最小限のnginx.confはこんな感じ:
http {
# proxy_cache_pathとproxy_temp_pathは同じファイルシステム上に配置するのがパフォーマンス上よい
# keys_zoneの1mは共有メモリのサイズ。1MiBあたり約8000個のキーを保持できるので、それほど大きくなくて良い
# max_sizeは全キャッシュファイルのサイズ合計の上限
# inactiveで指定した期間内にアクセスされなかったキャッシュファイルは、その有効期間に関わらず削除される(デフォルトで10分)
proxy_cache_path /var/cache/nginx keys_zone=zone1:1m max_size=1g inactive=24h;
proxy_temp_path /var/cache/nginx_tmp;
# オリジンから来るCache-Controlを無視する
#proxy_ignore_headers Cache-Control;
server {
server_name _;
listen 80;
root /srv/http/;
location ^~ /sinatra/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:9292/;
proxy_cache zone1;
#proxy_cache_valid 200 302 3s;
# レスポンスヘッダにキャッシュヒットしたかどうかを含める
add_header X-Nginx-Cache $upstream_cache_status;
}
}
}
キャッシュを設定する上で考えるポイントは
- キャッシュの有効期間
- キャッシュの最大容量
だと思う。
1. キャッシュ有効期間はproxy_cache_valid
とオリジンが出すCache-Control
で決まる。
proxy_cache_validが無し、Cache-Controlが無し
→キャッシュされない
proxy_cache_validが有り、Cache-Controlが無し
→キャッシュされる
proxy_cache_validが無し、Cache-Control: max-age=10, public, must-revalidate
→キャッシュされる
proxy_cache_validが有り、Cache-Control: max-age=10, public, must-revalidate
→キャッシュされる。Cache-Controlで指定した有効期間が優先される。
nginxは基本的にオリジンが出すCache-Control
を見ている。no-cache
やprivate
が含まれているとキャッシュされないので、キャッシュさせたければproxy_ignore_headers Cache-Control;
を書くと良い。
max-age
とs-maxage
が同時に指定されている場合、s-maxage
が優先される。
s-maxage
の意味は、中間のプロキシに対してキャッシュの有効期限を指定する(オリジンとエンドクライアントの間にあるプロキシ全てに対して有効になるはず)。
2. 最大容量はmax_size
で決まる
cache manager processがファイルシステムを監視していて、容量が超えた場合は削除してくれる。
その他注意点
- nginxには手動でキャッシュファイルを削除する仕組みはない
- 削除したいときはrmコマンドを使う(ただし
/var/cache/nginx
ディレクトリ自体ではなく、その中身を削除する方がよいと思う)
- 削除したいときはrmコマンドを使う(ただし
- nginxを再起動してもキャッシュファイルは残る
- nginxを再起動すると、キャッシュディレクトリが存在しない場合は作成される(親ディレクトリに書き込み権限があれば)