投稿日:2010年3月23日 -投稿者 S.M.
Varnishを動かしてみた 設定編
前回から随分と日が経ってしまいましたが、
今回はvarnishの設定について書きたいと思います。
前回は基本的な構成で動作するところまで進めましたが、
バックエンドサーバから見るアクセス元のIPがvarnishサーバになるため、
アクセスログのIPが全てvarnishサーバのIPになってしまう。
「webが2台構成の場合どうすんの?」といった実際の運用で躓きそうな点を調べてみました。
まずは、IPアドレスの問題。
PHPの場合、アクセス元IPは$_SERVER["REMOTE_ADDR"]で取得しますが、
前述のとおり、$_SERVER["REMOTE_ADDR"]にはvarnishサーバのIPが入っています。
これを何とかしてリモートIPを取得するには、VCLのvcl_recvに以下の記述を追加します。
# Add a unique header containing the client addressremove req.http.X-Forwarded-For;set req.http.X-Forwarded-For = client.ip;
こうすることで本来$_SERVER["REMOTE_ADDR"]に入るはずデータが$_SERVER["HTTP_X_FORWARDED_FOR"]で取得できるようになります。
次にWebサーバが複数台構成の場合。
varnishはデフォルトでロードバランシングする機能が備わっているので、この機能を利用します。
なお、バージョン2.0.5で試したところ、正常な設定でもVCLファイルがシンタックスエラーになる問題が発生しました。バージョンを2.0.6にあげると問題が解消されたので、同じような現象に遭遇した場合は最新版にアップデートすることをお勧めします。
さて、ロードバランシングの設定ですが、これもvclに設定を追加するだけです。
以下のように書いてみましょう。
director www_director round-robin {
{ .backend = { .host = “www1.example.com”; .port = “http”; } }
{ .backend = { .host = “www2.example.com”; .port = “http”; } }
}
sub vcl_recvに以下の記述を追加。
if (req.http.host ~ “^www.example.com$”) {
set req.backend = www_director;
}
これで、「www.example.com」にアクセスがあった場合、
「www1.example.com」「www2.example.com」のどちらかに転送されるようになります。
なお、director宣言の「round-robin」部分ですが、「round-robin」と「random」のどちらかを記述する必要があります。環境に応じて適宜変更しましょう。

