ウェブインターフェースのアプリケーションで何かしらのデータを動的に生成して配信したいけど効率的な配信とかキャッシュは面倒だしnginxの力を借りたい。
proxy_storeとかを使って、nginxでは404の時だけ後ろのアプリケーションサーバに取りに行く。
server {
listen 8888;
server_name localhost;
location / {
root /tmp/data;
error_page 404 = @data;
}
location @data {
internal;
proxy_pass http://localhost:4567;
proxy_store on;
proxy_store_access user:rw group:r all:r;
proxy_temp_path /tmp/data/temp;
root /tmp/data;
}
}
こんなアプリケーションと一緒に動かす。
(とりあえずここではSinatraでサクッと)
#!/usr/bin/ruby
require 'sinatra'
get '/*' do
"Generated at #{Time.now.to_s}\n"
end
delete '/:path' do
path = "/tmp/data/#{params[:path]}"
File.unlink path
"delete #{path}\n"
end
組み合わせて使うと
$ curl http://localhost:8888/hoge
Generated at 2012-08-02 23:03:25 +0900
$ date
2012年 8月 2日 木曜日 23時03分27秒 JST
$ curl http://localhost:8888/hoge
Generated at 2012-08-02 23:03:25 +0900
$ cat /tmp/data/hoge
Generated at 2012-08-02 23:03:25 +0900
このように、初めてアクセスがあった時だけ後ろのSinatraに問い合わせてローカルに保存。そして
$ curl --request DELETE http://localhost:4567/hoge
delete /tmp/data/hoge
$ curl http://localhost:8888/hoge
Generated at 2012-08-02 23:03:40 +0900
SinatraのDELETEメソッドを叩きhogeを削除してまたアクセスすると、再度hogeを生成する。ぼちぼち使い道がありそう。