Varnish をインストールしたら最初にやること(設定!)

今回はインストール直後の最低限の設定方法を紹介します。

Varnish の待ち受けポート番号を変更する

Varnish のインストール直後の待ち受けポート番号は 6081 になっています。またバックエンド(実際に Web サービスを行う Web サイト、リアル Web サーバとも言う)は IP アドレスが 127.0.0.1 のポート番号が 8080 になっており、このままだとユーザが 80 番ポートに HTTP アクセスしてきても接続すらできません。

ユーザが接続できるようにするには Varnish の待ち受けポート番号を 80 に変えるか、ルータ側で 80番ポートを 6081 に転送するようにする必要がありますが今回はルータ側の設定変更については大きくなってしまうので触れません。

Varnish の待ち受けポート番号を変えるには Varnish 起動時のオプションを変える必要がありますがこれは /etc/default/varnish(Ubuntu 系の場合)か /etc/sysconfig/varnish(Redhat 系の場合)で編集することができます。以下の例のようにエディタで設定して下さい。

(省略)
#DAEMON_OPTS="-a :6081
DAEMON_OPTS="-a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m"
(省略)

この後 Varnish を再起動(もしくは起動)する必要があります。ただし、既に Apache 等が 80番ポートで起動しているのであれば停止してから起動する必要があります。

$ sudo service varnish restart

もちろんですがバックエンドが Apache の場合、http.conf の Listen の値を 80番以外にしておく必要があります(そうでないと起動できません)。

Varnish のバックエンドの設定を変える

続いて Varnish のバックエンドの設定を変えます。この設定は /etc/varnish/default.vcl で行います。設定は VCL という C言語ライクな独自言語で Varnish 起動時に C言語にコンパイルしている様子です(その為、C言語も直接書くこともできる)。

最初は既述したようにバックエンドの設定が 127.0.0.1:8080 になっているのですが、これを実際のバックエンドの設定に合わせて変更します。以下は 8090 に変更した場合の例です。

(省略)
backend default {
  .host = "127.0.0.1";
  .port = "8090";
}
(省略)

Varnish でキャッシュできるようにする

最後に Varnish でバックエンドページをキャッシュするようにします。これも簡単で /etc/varnish/default.vcl をエディタで開いてコメントアウトを解除**するだけです。

(省略)
sub vcl_recv {
  if (req.restarts == 0) {
    if (req.http.x-forwarded-for) {
      set req.http.X-Forwarded-For =
      req.http.X-Forwarded-For + ", " + client.ip;
    } else {
      set req.http.X-Forwarded-For = client.ip;
    }
  }
  if (req.request != "GET" &&
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
        /* Non-RFC2616 or CONNECT which is weird. */
        return (pipe);
  }
  if (req.request != "GET" && req.request != "HEAD") {
      /* We only deal with GET and HEAD by default */
      return (pass);
  }
  if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      /* サイトがクッキーを発行している場合、この箇所はコメントアウトしておく */
      return (pass);
  }
  return (lookup);
}
(省略)

これで完了です。この後再度 Varnish を再起動してブラウザでサイトにアクセスしキャッシュが聞いているかを確認します。

キャッシュが効いているか確認する

キャッシュが効いているかを確認する方法は色々あるのですが私がよく使うのは Varnish のアクセスログを出力する varnishncsa のフォーマットを少し変えてログの最後にキャッシュにヒットしたかどうかを追加する方法です。

これには /etc/init.d/varnishncsa をエディタで開き、varnishncsa 起動オプションに以下の行を追加します(変数には入れずに直接挿入が必要)。

-F "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i" %{Varnish:time_firstbyte}x %{Varnish:handling}x"

例えば、Ubuntu 系の場合は以下のようになります(CentOS は試していません)。

(省略)
    if start-stop-daemon --start --quiet --pidfile ${PIDFILE}
        --chuid $USER --exec ${DAEMON} -- ${DAEMON_OPTS} -F "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i" %{Varnish:time_firstbyte}x %{Varnish:handling}x"
        `>` ${output} 2>&1; then
(省略)

追加できたら varnishncsa を再起動します。

$ sudo service varnishncsa restart

/var/log/varnish/varnishncsa.log を開くと以下のように行の最後にキャッシュにヒットしたかどうかも出力されるようになります。

225.225.225.225 - - [08/Feb/2010:06:38:30 +0900] "GET http://www-inframa.rhcloud.com/ HTTP/1.1" 200 5400 "http://www-inframa.rhcloud.com/" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" 0.252477884 hit

最後の文字が hit であればキャッシュにヒットしています。

Published by in Linux, Web 技術, インストール, オープンソース and リバースプロキシ using 315 words.