A Peak Never Ending !

Nginx Proxy_storeディレクティブ

恐らくあまり使いたい人はいないかなと思うディレクティブだけど使いたいと思った時に少し詰まったのでメモ。
どんなことが出来るのかというとリクエストを受けた際に

  • ローカルのディレクトリをみる
  • ファイルが存在していればそのままレスポンスを返す
  • ファイルがない場合はupstreamにリクエストを流し見つかった場合はローカルに保存しつつ返す

といった事ができる。
nginx wikiに「To be clear proxy_store is not a cache, it’s rather mirror on demand.」とあるように 要はリクエストを受けたファイルのみコピーしてミラーを作るような事ができる。

設定例はこんな感じ。

nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location /images/ {
    root                 /data/www;
    error_page           404 = @fetch;
}

location @fetch {
    internal;

    proxy_buffering      on;
    proxy_pass           http://backend;
    proxy_store          on;
    proxy_store_access   user:rw  group:rw  all:r;
    proxy_temp_path      /data/temp;

    root                 /data/www;
}

1つめのlocationは/images/配下にアクセスが来た際に/data/wwwディレクトリの下にファイルがなければ(404) @fetch locationに移動する。
2つめの@fetch locationではリバースプロキシとしてbackendホストにリクエストをフォワードしてファイルがあった場合は/data/wwwにパーミッションを 664にして保存するといった感じ。
proxy_bufferingをoff(デフォルトはon)にしてたせいでファイルが保存されなかったけど、proxy_storeの説明には特に記述がなかったため 自分で試したときに結局nginxのソースまで追うはめになってしまった。
まあいずれにせよあんまり使いたいと思う人はいないんじゃないかなぁ。