isTKS™tool ≫ Varnish導入手順

Varnish導入手順

2016.05.09

★★★ Varnish導入手順 ★★★

参考サイト


https://www.varnish-cache.org/docs/4.1/reference/varnishd.html

http://book.varnish-software.com/4.0/

http://chemosurgical23.rssing.com/chan-12372931/all_p5.html

http://www.1x1.jp/blog/2013/12/varnish-cache.html

http://www.slideshare.net/xcir/varnishesi

http://ikeikeikeike.hatenablog.com/entry/varnish-administrator

下記の導入環境にて導入済

OS: CentOS 6.7 (by Vagrant)
Varnish: Port : 6081(Default)
Apache: Port : 80(Default)

★★ Varnish インストール ★★
デフォルトyumだとバージョン2系で古いのでVer4.1系のリポジトリ追加(2016.04時点で最新)

$ sudo rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.1.el6.rpm
$ sudo yum install varnish --enablerepo=varnish-4.1,epel

4.1系の最新(4.1.2)が入る

epel repositoryを明示的に指定するようにすると、後述エラー (libjemalloc) を回避できるとのこと。

$ sudo yum install varnish --enablerepo=varnish-4.1,epel

libjemallocがないって言われてyum installがこける場合

$ cd /usr/local/src/
$ sudo wget https://github.com/jemalloc/jemalloc/releases/download/4.1.0/jemalloc-4.1.0.tar.bz2
$ sudo tar jxvf jemalloc-4.1.0.tar.bz2
$ cd jemalloc-4.1.0
$ sudo ./configure
$ sudo make && sudo make install

VarnishでCookie値を個別取得できるようにするには、
→ デフォルトVarnish4は、Cookieをキー名で取得できないので、varnish-modulesを追加導入する必要がある。設定ファイル内でimport cookieして利用する。

$ sudo yum install -y varnish-libs-devel
$ cd /usr/local/src/
$ git clone git@github.com:varnish/varnish-modules.git
$ cd varnish-modules/
$ ./bootstrap
$ ./configure
$ sudo make
$ sudo make install

$ ls /usr/lib64/varnish/vmods
>諸々入っていればOK

※使い方は、設定ファイル冒頭に
import cookie
を一行追加すれば使えます。

起動

$ sudo service varnish start
Starting Varnish Cache:                                    [  OK  ] ← 起動OK

再起動

$ sudo service varnish restart
Stopping Varnish Cache:                                    [  OK  ]
Starting Varnish Cache:                                    [  OK  ] ← 再起動OK

自動起動

$ sudo chkconfig varnish on
$ sudo chkconfig --list varnish
varnish         0:off   1:off   2:on    3:on    4:on    5:on    6:off ← 2から5がonになっていればOK

★★ 設定ファイル 2種類 ★★

$ cp /etc/sysconfig/varnish /etc/sysconfig/varnish__org ←バックアップ
$ sudo vi /etc/sysconfig/varnish
VARNISH_LISTEN_ADDRESS=0.0.0.0 #←追記しないとエラーで起動できないケースもある
VARNISH_LISTEN_PORT=6081
$ cp /etc/varnish/default.vcl /etc/varnish/default.vcl__org ←バックアップ
$ sudo vi /etc/varnish/default.vcl
backend default {
    .host = "127.0.0.1";
    #.port = "8080";
    .port = "80"; ← port80(バックエンドのWebサーバー(Apache)のPort)に変える
}
sub vcl_backend_response {
    set beresp.do_esi = true;← ESIを利用する(ブロック別の分割キャッシュ機能を有効)
}

ブラウザチェック
Varnish再起動後に

http://localhost:6081/

でサイトが見れればここまでOK

★★ ログファイル ★★
(ログ必要なければ割愛してください)
ログコマンド(varnishncsa)を指定ファイルに出力させて、それをtail -f で見る

$ sudo varnishncsa -a -w /var/log/varnish/access.log -D -P /var/run/varnishncsa.pid
$ tail -f -n 100 /var/log/varnish/access.log

★★ 補足 ★★
VCL ファイルのシンタックスチェックは下記でできる

$ sudo varnishd -C -f /etc/varnish/default.vcl

★★ 設定ファイル例(Ver4.1.2) ★★
3系と4系で書式がかなり違うので注意。
→ ※3系の設定を記載しているブログが多い

$ sudo vi /etc/varnish/default.vcl
vcl 4.0;
import std;
import cookie;

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {

    #redirect
    if (req.http.X-Forwarded-Proto == "http") {
        #return (synth(750, "")); #httpsにリダイレクトさせたい場合
    }
    #url
    if (req.url ~ "/xxxxx/") {
    } else {
        return (pass); #特定URL以外はキャッシュさせない
    }

    #device
    if (req.http.User-Agent ~ "(?i)i(Phone|Pad|Pod)") {
        set req.http.X-UA-Device = "sp";
    } else if (req.http.User-Agent ~ "(?i)Android") {
        set req.http.X-UA-Device = "sp";
    } else if (req.http.User-Agent ~ "(?i)Googlebot-Mobile") {
        set req.http.X-UA-Device = "sp";
    } else {
        set req.http.X-UA-Device = "pc";
    }

    if (req.method != "GET" && req.method != "HEAD" && req.method != "PUT" && req.method != "POST" && req.method != "TRACE" && req.method != "OPTIONS" && req.method != "DELETE") {
        return (pipe);
    }
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }
    if (req.http.Authorization) {
        return (pass);
    }

    return (hash);
}

sub vcl_hash {
    # Cookie.lang毎にキャッシュ
    cookie.parse(req.http.cookie);
    hash_data(cookie.get("lang"));

    # Device毎にキャッシュ
    hash_data(req.http.X-Device);

    # HTML, JS, CSS毎にキャッシュ
    #hash_data(req.http.Accept);

    # URL毎にキャッシュ
    hash_data(req.url);

    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return(lookup);
}

sub vcl_backend_response {
    if (bereq.url ~ "/xxxxxx/") {
        #logを/var/logs/messageに出力してくれる
        #std.syslog(180, "BACKEND_RESPONSE: " + bereq.url);
    } else {
        set beresp.ttl = 0s;
        set beresp.do_esi = false;
        return (deliver); #特定URL以外はキャッシュさせない
    }

    set beresp.do_esi = true;
    if (bereq.url ~ "/xxxxx/") {
    } else {
      set beresp.ttl = 3600s;
    }
    if (bereq.url ~ "\.(html|htm|css|js|txt|xml|svg)(\?[a-z0-9=]+)?$" ) {
        set beresp.do_gzip = true;
    }
    return(deliver);
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    set resp.http.X-Lang = cookie.get("lang");
}

sub vcl_backend_error {
    return (retry);
}
sub vcl_synth {
    if (resp.status == 750) {
        set resp.status = 301;
        set resp.http.Location = "https://" + req.http.host + req.url;
        return(deliver);
    }
}
  • このエントリーをはてなブックマークに追加