実運用するにはほど遠いのですが、varnish 4.0.1の設定をしてみたので作業メモを。
前提条件
まず、varnish
には余り細かい設定を追加せずに、基本的にはリバースプロキシとしての動作に専念させたいと思っています。その方がVCLが綺麗に保てるし、チューニングなどをする場合のメンテナンス性も高いのでは無いかなと。
そのため、前段にnginx
などのHTTPサーバが居て、varnish
などへの振り分け処理を行う前提とします。後段には実際のコンテンツを保持しているHTTPサーバが居るので、varnish
に期待している役割はキャッシュやロードバランスなどになります。
※ということで、フロントに置く場合に必要そうな設定などは想定していません。
作業手順
yumリポジトリ設定
$ sudo rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
$ sudo yum -y install varnish
$ varnishd -V
varnishd (varnish-4.0.1 revision 4354e5e)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2011 Varnish Software AS
公式の最新版からインストールします。
インストールが終わったら/etc/yum.repos.d/varnish.repo
はenable=0
にしておいてもいいかもしれません。
初期設定
まずは起動パラメータ等を変更するために/etc/sysconfig/varnish
を変更します。
@@ -62,7 +62,7 @@
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
-# VARNISH_LISTEN_ADDRESS=
+VARNISH_LISTEN_ADDRESS=127.0.0.1
VARNISH_LISTEN_PORT=6081
#
# # Telnet admin interface listen address and port
フロントにnginx
が居る想定、ということで、ローカルホストからのみ受信するように設定を絞ります。
不特定のアドレスに対して公開する場合などであれば、ここの設定変更は不要かもしれません。
※因みに、iptablesなどで締めている場合は当然そちらの設定変更も必要になります。
その他に気になるところとしては、ストレージサイズの設定変更があるのですが、初期値がmalloc,256M
だったので、ここはこれで充分かなと思いそのままにしました。
vcl 4.0;
backend www_host {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
backend com_host {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
backend net_host {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
if (req.http.host == "www.example.org") {
set req.backend_hint = www_host;
}
else if (req.http.host == "www.example.com") {
set req.backend_hint = com_host;
}
else if (req.http.host == "www.example.net") {
set req.backend_hint = net_host;
}
else {
return (synth(403, "Forbidden"));
}
}
現時点では細かいチューニングなどは実施していませんし、ディレクターの設定などもしておらず、単にドメイン毎にバックエンドを切り替えるだけの設定でしかありません。vcl_recvでreq.http.hostのチェックをして、適切な場合にバックエンドの設定をし、当て嵌まらない場合は403でリジェクトするポリシーになります。
- 先頭の
vcl
記述 - バックエンドの指定は
req.backend_hint
で設定 -
error
じゃなくてsynth
を使う
↑ VCL 4.0に合わせて記載してみたのですが、この辺がこれまでとの違いなのかな…
参考:Version statement, Directors have been moved to the vmod_directors, error() is now synth()
VCLを作成したら構文チェックをしておきたいのですが、/var/lib/varnish/$HOSTNAME
あたりのディレクトリ書き込み権限が無くてエラーになってしまうのでsudo
しています(^_^;)
※適切なディレクトリのパーミッション設定をすればいいのだろうか…
$ sudo varnishd -C -f default.vcl > /dev/null
Message from VCC-compiler:
Backend host '"xxx.xxx.xxx.xxx"' could not be resolved to an IP address:
Name or service not known
(Sorry if that error message is gibberish.)
('input' Line 4 Pos 13)
.host = "xxx.xxx.xxx.xxx";
------------#################-
Running VCC-compiler failed, exit 1
VCL compilation failed
$ vi default.vcl
$ sudo varnishd -C -f default.vcl > /dev/null
$
何も考えずに作ってみた物をコピペして構文チェックしてみると、上記の様にエラーになりますw
構文エラーと言われたIPアドレス部分を適切に設定すれば構文エラー無しで何も表示されません(/dev/nullに捨てていれば)
varnishサービスの起動
という感じで動作確認します。
$ sudo service varnish start
Starting Varnish Cache: 0
[ OK ]
$ curl --head --header "Host: www.example.org" http://localhost:6081/
HTTP/1.1 200 OK
Server: Apache
Via: 1.1 varnish (v4)
(略)
$ curl --head --header "Host: www.example.com" http://localhost:6081/
HTTP/1.1 200 OK
Server: Apache
Via: 1.1 varnish (v4)
(略)
$ curl --head --header "Host: www.example.net" http://localhost:6081/
HTTP/1.1 200 OK
Server: Apache
Via: 1.1 varnish (v4)
(略)
$ curl --head http://localhost:6081/
HTTP/1.1 403 Forbidden
Server: Varnish
(略)
各ドメイン毎の挙動確認と未指定時のエラー確認ができました。
varnishncsaサービスの起動
大した事はしていないので、敢えてログサービス使わないという選択肢もいいのではないかと思うのですが、一応varnishncsaだけは動かしておくことにします。
$ rpm -ql varnish | grep logrotate
/etc/logrotate.d/varnish
$ sudo service varnishncsa start
Starting varnish ncsa logging daemon: [ OK ]
$ cd /var/log/varnish
$ tail -F varnishncsa.log
(略)
一応/etc/logrotate.d/varnish
がパッケージに含まれて(rotateされて)居ることを確認する程度には気が小さいですw
自動起動設定
$ chkconfig --list | grep varnish
varnish 0:off 1:off 2:off 3:off 4:off 5:off 6:off
varnishlog 0:off 1:off 2:off 3:off 4:off 5:off 6:off
varnishncsa 0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo chkconfig varnish on
$ sudo chkconfig varnishncsa on
$ chkconfig --list | grep varnish
varnish 0:off 1:off 2:on 3:on 4:on 5:on 6:off
varnishlog 0:off 1:off 2:off 3:off 4:off 5:off 6:off
varnishncsa 0:off 1:off 2:on 3:on 4:on 5:on 6:off
自動起動の設定としても、varnishlog
は動かさないままにしておきます。