使えるシステムから使いたいシステムへ、有限会社アテージ

昨年末からWordPressをVarnish+Nginx+PHP-FPMの環境で動作させるためのコラムを始めましたが、今回はVarnishのキャッシュの設定についてです。例によってUbuntu12.04にパッケージからインストールしたという前提で話をすすめます。

VarnishはVCLという独自の言語(概要はこちら)によって設定します。ちなみに”VCL”は文字通り”Varnish Configuration Language”の略です。

/etc/varnish/default.vclを覗いてみるとコメントアウトされたvcl_XXXXという名前のサブルーチンが並んでいるのが確認できます。この関数内にVarnishの各処理地点で実行させたい処理を記述します。このサブルーチンのうちほとんどの場合、vcl_recvもしくはvcl_fetchを編集することになります。

またそれぞれのサブルーチンで実行できる処理(action)が決まっていて”return(action)”の形で呼び出します。

(1) 主なフックとアクション
vcl_recv リクエストを受け取ったときの処理

action: pass, pipe, lookup, error code

vcl_fetch レスポンスをバックエンドサーバーから取り出したときの処理

action: deliver, hit_for_pass, restart, error code

(2) vcl_recvの編集

WordPressの管理画面へのアクセスと管理画面へログインした状態(Cookieにwordpress_logged_in_XXXXという名前の変数がセットされている)でのアクセスはそのままバックエンドサーバーにリクエストを送ります。管理画面での編集やプレビューの場合キャッシュが邪魔するのを防ぐためです。

それ以外の場合はCookieヘッダを削除してキャッシュを利用するという処理を追加します。Cookieヘッダを削除するのはキャッシュのヒット率を上げるためです。

なお2〜9行のコメントを外しているのはNginx側でVarnishの稼動しているホストのIPではなく、クライアントのIPをNginxに伝えるための記述です。Nginx側でもこれを拾うための設定を記述する必要があります。(最後の補足を参照)

(3) vcl_fetchの編集

クライアントへのレスポンスにキャッシュを利用する処理を追加(アンコメント)します。

(4) Apache Bench

ここまでの設定をしてApache benchを実行してRequests per secondを変更前と比較すると50〜100倍程度のリクエストを処理できています。

補足:NginxでクライアントのIPを拾う設定

Nginxの設定ファイルに以下の2行を追加。