今回も Varnish VCL の説明でこちら の続きです。今回は Varnish VCL 言語の変数の変更と include 機能について説明します。
VCL 変数の変更
こちら で VCL で扱える変数について説明しましたが、その多くの変数は vcl サブルーチン内で変更することができます。これは set という文で始め “set [変更したい変数] = [変更したい変数や内容(文字列等)];” といった具合に使います。
以下はこれまでも出てきた 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;
}
}
・
(抜粋)
・
これを例にとるとまず上の 2行目でリクエストのリスタート回数が 0、つまりバックエンドからの応答エラーがこのリクエストにおいて無かった場合を意味します。この場合 3行目で X-Forwarded-For 、つまりこれまでの経路があるかどうかを確認し、経路があった場合に 4行目でこの経路にクライアントの IP を追加し、経路がなかった場合は単にクライアントの IP を設定しています。
Varnish はリバースプロキシサーバになりますが、バックエンドの Web サーバ側ではリクエストを受けた IP アドレスが全て Varnish の IP アドレスになってしまう為、クライアントの IP アドレスを設定しているのがこの処理の内容になります。
このように set 文をつかうことで文字列であっても backend で定義したバックエンドであっても設定することができます。
とっても嬉しい include
最後に include についても説明します。Varnish では VCL 言語を用いて設定を好きなように書くことができますがシステムが複雑になればなるほど設定が長くなり VCL で既述したソースが見づらいものになってきます。
この為、Varnish では他のファイルで定義した VCL ファイルを include [ファイル名] と記載した箇所に挿入することができます。
例えば以下の例を見てください。
include "site1.vcl"; # パスがなければ /etc/varnish/site1.vcl を意味する
sub vcl_recv {
if (client.ip ~ localnet) {
return(pipe);
}
・
(抜粋)
・
}
この例では 1行目で site1.vcl を include しています。Varnish 起動時に C 言語に変換される時にこの 1行目には site1.vcl の内容がそのまま挿入されます。
なお、この時 site1.vcl でもサブルーチン vcl_recv を定義していた場合、先に定義した site1.vcl の vcl_recv が実行されます。
include 文をどのように使うかは状況次第ですが細分化可能な箇所は分けておいた方が後でわかりやすくなります。