Varnish導入手順
★★★ 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とある CMS を使ったサイトに Varnish を導入した話
下記の導入環境にて導入済
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); } }