こちら に続き、Varnish で使われている VCL 言語について簡単に説明します。今回は Varnish VCL 言語の条件文・演算子・使える変数について説明します。
VCL の条件文
まずは Varnish VCL の条件文について説明します。条件文はプログラムを書く上では重要で「〜の時」を意味しその状況に応じて処理を変えることができます。Varnish ではこの条件に if 文を使うことができます。
以下に例を示します。
sub vcl_recv {
if (req.request == "GET" && client.ip ~ "192.168.1.5") {
# リクエストが GET メソッドでなおかつ IP アドレスが 192.168.1.5の場合に処理
return (pipe);
}
}
上の例のように if という予約語の後にカッコをつけて真となる条件を既述していきます。この時の == や ~ 等は演算子と呼び、真となるかどうかを決定する為に使います。また、req や client は変数といい Varnish では事前に状況に応じて「client.ip にはクライアントの IP が格納される」という具合に値が入ります。
VCL で使える演算子
VCL では次のような演算子をサポートしています。
==
左辺と右辺が等しい
!=
左辺と右辺が等しくない
||
または
&&
なおかつ
~
正規表現
!~
正規表現(等しくない)
※ 正規表現はここでは扱い切れないのでいつか。。。
VCL で使える変数
次に Varnish VCL で使える変数を以下に示します。変数は req.request 等 .(ドット)区切りの入れ子になっておりさらに下の階層があったりと多岐に渡る為、ここではトップの変数のみ扱い次回の記事等で代表的な変数を説明します。
now
現在時刻
client
クライアントを意味する(クライアントの IP アドレス等)
server
このサーバを意味する
req
リクエストを意味する
bereq
バックエンドへのリクエストを意味する
beresp
バックエンドからのレスポンスを意味する
obj
キャッシュに入ったオブジェクトを意味する
resp
レスポンスを意味する
これらはそれぞれ「vcl_recv では使えず、vcl_fetch では使える」等状況に応じて利用可否や内容も異なってきます。