Varnishについて

今週FastlyのStockholm(BMA)で障害が発生1し、私たちのサイトも影響を受けました。その際出てきた「varnish」というミドルウェアについて調べたときのメモです。

Varnishとは

github.com

Varnish Cache is a web application accelerator also known as a caching HTTP reverse proxy.

Introduction to Varnish

  • HTTPレベルでキャッシュを行うHTTPアクセラレータ。
  • カーネルの機能を最大限利用することで高速化を図っている。
  • ディスクへのデータ書き込みをデフォルトでは一切しないので、プロセス終了時に全てのキャッシュが消える。
  • 設定はVCL(Varnish Configuration Language)というDSLで記述する。動的に変更可能。
  • ログもデフォルトではファイルに書き込まれない。
  • Fastlyの中心技術2。各リージョンにVarnishキャッシュサーバを置いていると雑に考えても間違いではなさそう。
  • SSLが使えないのでnginxを前に置く構成が多いらしい。

動かしてみる

varnishをnginxの手前に置いて、nginxのindex.htmlをvarnish経由で返してみる。

参考記事: Getting Started with Varnish Cache

環境

1. コンテナの起動 3

$ docker run --privileged -d -p80:80 --name=varnish centos /sbin/init

2. nginxのインストール&起動 4

$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
$ yum install -y nginx
$ systemctl start nginx

3. Varnish Cashのインストール

$ yum install -y epel-release
$ yum install -y varnish

4. nginxのポートを8080に変更

etc/nginx/conf.d/default.conf

server {
    listen       8080;

    ...
}

リロード

$ systemctl reload nginx

5. varnishのポートを80に変更

etc/varnish/varnish.params

VARNISH_LISTEN_PORT=80

起動

$ systemctl start varnish

6. アクセスしてみる

$ curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx/1.13.6
Date: Sun, 19 Nov 2017 10:46:05 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 10 Oct 2017 15:59:40 GMT
ETag: "59dcee6c-264"
X-Varnish: 22 20
Age: 3
Via: 1.1 varnish-v4
Connection: keep-alive

2回目アクセス以降X-Varnishの値が2つ返っていればキャッシュされている5

また、nginxのアクセスログに2回目以降のアクセスログが残らないことも確認できた。(キャッシュ間隔のデフォルトは5分。)

疑問

  • (リバースプロキシとしている)nginxでも同じことができるのではないか。
    • わざわざnginxの後ろにVarnishを置く理由。

参考