LoginSignup
5
2

More than 5 years have passed since last update.

Varnishを触ってみた時のメモ

Posted at

環境

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
5
2
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
5
2