使える!サーバ運用の実践テクニック

第14回 [キャリアアップ編⑤]varnishを使おう④─実践varnish

この記事を読むのに必要な時間:およそ 3 分

大規模コンテンツ配信の仕組みとしてvarnishをテーマに連載してまいりましたが,今回は,実際にサービスでも利用しているxcir氏(いわなちゃん)にご協力いただき,本連載におけるvarnishシリーズをまとめたいと思います。それではxcirさんよろしくお願いします。

はじめまして,xcir(いわなちゃん)といいます。今回は,varnish実践編ということで,運用に役立つテクニックなどをテーマにご紹介できればと思います。なお,今回の内容につきましては特記がない限りCentOS上で動かしたvarnish2.1.4での記載となります。

VCLについて

varnishは複雑な設定をしなくても高速に動きますが,決め細やかな制御を行う際は,VCL(varnish configuration Language)の設定が必要です。VCLは一般的な設定ファイルとは違い,まるで言語のように記述して動作します。

実際にVCLはCに解釈されたあと,コンパイルされ共有ライブラリ(.so)としてvarnishからロードされます。そのため,たとえばApacheの設定のようにon/offの大量に組み合わせてということがありません。その点がvarnishの難しさでもあり,また慣れると楽な点であります。

サブルーチンについて

前回第13回)⁠サブルーチンの種類については説明しましたが,実際どのように連携して動作するかを図1に記載します。赤い矢印の箇所はバックエンドからデータを取得している部分となります。

図1 サブルーチンの連携

図1 サブルーチンの連携

この図は簡易版ではありますが,大体の動作のイメージはつかめるかと思います。なおvarnishを動作させる際によく使うのがvcl_recvとvcl_deliverです。本番運用を前提においても特殊な動作をさせない場合は,この部分の変更で実サービスを提供することができると思います。

VCLのデバッグの仕方(起動するまで)

VCLで複雑な設定をする際はもちろん,簡単な設定を行う際もデバッグが必要です。しかし,varnishの起動スクリプトにはconfigtestのオプションがありません。 毎回varnishをrestartして設定確認というのは実サービス提供を考えると現実的でない部分もあります。そこで以下のコマンドを使用します。

varnishd -d -f [VCLファイル名] -C

このコマンドを使用すると成功した場合はVCLをC言語に解釈した際のコードを,記述ミスがあるとその内容を教えてくれます。

たとえば以下のようなvclを記述したとします。

backend default {
    .host = "127.0.0.1"
    .port = "81";
}

上記VCLはhostの指定行から「;」を抜いていますが,このような記述ミスを,restartをして起動の成否で探し出すのは非常に大変です。

しかし先ほどのコマンドを通してみると

 [root@LIP-APP-01 # varnishd -d -f test.vcl -C
Message from VCC-compiler:
Expected ';' got '.'
(program line 483), at
(input Line 3 Pos 3)
.port = "81";
--#------------

In backend specification starting at:
(input Line 1 Pos 1)
backend default {
#######----------
Running VCC-compiler failed, exit 1
[root@LIP-APP-01#

上記の通り3行目の3文字目が間違っていると指摘してくれます。

VCLのデバッグの仕方(起動してから)

実際に起動してから,どのように動作しているかを確認する際はどうすればいいでしょうか? CやPerlやPHPといった言語でよくやる方法として,printfなどで変数などを出力して確かめてみたことがあると思います。varnishでもバージョン2.1.3から追加されたlogメソッドとvarnishlogコマンドを使うことによって実現が可能です。

まずVCLの任意のサブルーチン内で以下の形で記述をします。

  • log テキスト

そしてログ監視は,以下のコマンドで起動します。

varnishlog -i VCL_Log
細かい利用方法に関しては長くなるので,本連載では割愛します。詳細に関しては,(xcir)が記載しているwikiのvarnishのログ(Logging in varnish)を参照していただければ幸いです。

それでは実践編です。たとえばvcl_recvにおいて,リクエストのURLが/test/と一致する際にログを出したい際は,以下の通り記載します。

sub vcl_recv {
    if(req.url~"^/test/"){
    log "[req.url@test]"req.url;
    }
}

これをvarnishlogコマンドを起動してwgetで以下のリクエストをしてみると,以下のようなログが出力されます。

wgetでリクエスト

wget http://localhost/test/a.jpg

ログの内容

[root@LIP-APP-01 # varnishlog -i VCL_Log
12 VCL_Log c [req.url@test]/test/a.jpg

また,以下のようにwgetした際は当然ながらif内に入らないのでログは出力されません。このような形でログに出力させながらデバッグをしてけば良いかと思います。

wgetでリクエスト

wget http://localhost/hoge/a.jpg

LOGの内容

(LOGには出力されません)

著者プロフィール

高岡将(たかおかすすむ)

大手金融,独立系SIerにて気がつけば計18年以上のキャリアを重ねる。バランス感覚に長け,インフラ/アプリ,プレイヤ/マネージャなど関係なくこなし,「いそうだけどいないタイプ」と評価される。

仕事以外では,自転車,ジョギング,サックス等を趣味にし,密かに「エンジニアと健康」についてダイエット成功論の連載を企む。


xcir(いわなちゃん)

携帯コンテンツ業界でインフラ関連に従事。ここ最近は,積極的にvarnishを利用して分散,高速化等のテーマで活動中。

URL:http://blog.xcir.net

Twitter:@xcir

コメント

コメントの記入