環境
Centos6.7
Varnish 4
install
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/jemalloc-3.6.0-1.el6.x86_64.rpm
rpm -ivh jemalloc-3.6.0-1.el6.x86_64.rpm
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
yum install varnish
設定ファイル
/etc/varnish/default.vcl
キャッシュのルールを記述得するファイル
cat /etc/sysconfig/varnish
Varnishを起動するportとか記述するファイル
キャッシュルールのサンプル
/etc/varnish/default.vcl
vcl 4.0;
# キャッシュクリア用のリクエストを受け付けるipを列挙
# *のところを適当に環境に合わせて
acl purge {
"localhost";
"*.*.*.*"/*;
}
# プロキシするアプリケーションのホストとポート
backend default {
.host = "127.0.0.1";
.port = "3000";
}
# BANメソッドでリクエストした際に、URLを正規表現にキャッシュをBANリストに登録することでキャッシュクリアできるようにする
sub vcl_recv {
if (req.method == "BAN") {
if (!client.ip ~ purge) {
return(synth(405,"Not allowed."));
}
ban("req.http.host == " + req.http.host + " && req.url ~ " + req.url);
return(synth(200, "Ban added"));
}
}
# リクエストをキャッシュする際のハッシュを生成する。
# 今回はURLとHTTPリクエストヘッダー『X-Cache-Key』をもとにキャッシュキーを発行する
sub vcl_hash {
hash_data(req.url);
hash_data(req.http.X-Cache-Key);
}
# キャッシュのttlを適当な時間で設定する
# レスポンスヘッダー『X-No-Cache』が設定されている場合はキャッシュさせないようにする
sub vcl_backend_response {
set beresp.ttl = 3600s;
if (beresp.http.X-No-Cache) {
set beresp.uncacheable = true;
return (deliver);
}
}
# キャッシュにヒットしたか否かをレスポンスヘッダーに含めるようにする
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
サービスの起動・停止・再起動
/etc/init.d/varnish start
/etc/init.d/varnish stop
/etc/init.d/varnish restart
動作確認プログラム
サーバーアプリケーション
index.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
console.log('Hello World!');
res.send('Hello World!');
});
app.get('/a', function (req, res) {
console.log('Hello World!');
res.send('Hello World!');
});
app.get('/b', function (req, res) {
console.log('Hello World!');
res.send('Hello World!');
});
app.post('/', function (req, res) {
console.log('Hello World!');
res.send('Hello World!');
});
app.get('/no', function (req, res) {
console.log('Hello World!');
res.set({'X-No-Cache': 'true'});
res.send('Hello World!');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
})
クライアント
# 2回目以降のリクエストはキャッシュにヒットする
curl -H "X-Cache-Key: hoge" http://localhost -i
curl -H "X-Cache-Key: hoge" http://localhost -i
curl -H "X-Cache-Key: hoge" http://localhost -i
# X-Cache-Keyを別々にしているのでそれぞれ違うキャッシュキーとして扱われる
curl -H "X-Cache-Key: hoge" http://localhost -i
curl -H "X-Cache-Key: fuga" http://localhost -i
curl -H "X-Cache-Key: piyo" http://localhost -i
# POSTはキャッシュされない
curl -X POST http://localhost -i
curl -X POST http://localhost -i
curl -X POST http://localhost -i
# GET /noはキャッシュされないようにアプリケーション側で制御されている
curl http://localhost/no -i
curl http://localhost/no -i
curl http://localhost/no -i
# BAN /* ですべてのキャッシュを削除することができる
curl http://localhost/a -i
curl http://localhost/b -i
curl -X BAN http://localhost/*
curl http://localhost/a -i
curl http://localhost/b -i