LoginSignup
67
71

More than 5 years have passed since last update.

nginx proxyキャッシュまとめ

Last updated at Posted at 2016-12-31

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. キャッシュの有効期間
  2. キャッシュの最大容量

だと思う。

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-cacheprivateが含まれているとキャッシュされないので、キャッシュさせたければproxy_ignore_headers Cache-Control;を書くと良い。

max-ages-maxageが同時に指定されている場合、s-maxageが優先される。
s-maxageの意味は、中間のプロキシに対してキャッシュの有効期限を指定する(オリジンとエンドクライアントの間にあるプロキシ全てに対して有効になるはず)。

2. 最大容量はmax_sizeで決まる

cache manager processがファイルシステムを監視していて、容量が超えた場合は削除してくれる。

その他注意点

  • nginxには手動でキャッシュファイルを削除する仕組みはない
    • 削除したいときはrmコマンドを使う(ただし/var/cache/nginxディレクトリ自体ではなく、その中身を削除する方がよいと思う)
  • nginxを再起動してもキャッシュファイルは残る
  • nginxを再起動すると、キャッシュディレクトリが存在しない場合は作成される(親ディレクトリに書き込み権限があれば)
67
71
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
71