とってもやさしいリバースプロキシVarnishの使い方

RubyウェブアプリケーションフレームワークRamazeがとってもとっても素敵なので、ただいま実験としてささいなものを作成しております。HTTPdには今話題のthinを使おうかな、と思っているのですが、こうなると考えなければならないのがリバースプロキシですよね。"reverse proxy rails" あたりで検索すると真っ先にapacheの設定方法が出てくるわけですが、なんでもapacheというのもどうかな、と思いました。設定が煩雑になりますしね。そこでリバースプロキシである varnish を試してみました。varnishに関するドキュメントはあまり多くないのですが、varnish はとっても簡単なので素晴しいと思います。せっかくですから、varnishに関する設定方法などを簡単にまとめておきたいと思います。なお、私はサーバであっても ubuntu を使っておりますので(手抜き!)、ubuntu以外をお使いの方はそのつもりで適時読み替えてご覧下さい。

Varnish って何?

varnish はリバースプロキシサーバです。リバースの方向専門のサーバなので、普通のフォワードプロキシとしての機能は持ちません。リバースプロキシに関してはlivedoor ディレクター Blogさんの「サーバの種類とDBサーバ超基礎入門」がとってもとっても分かり易くて素敵な資料だなぁと思うのでそちらをご覧下さい。

なんでSquidを使わないの?

実績と信頼のプロキシサーバSquidは当然リバースプロキシとしても設定できるわけですが、私の目的ではフォワードプロキシは不要である以上、設定を間違えてうひょー!みたいな事にならないようにSquidは避けたいと思いました。そのため、varnishです。おまけに設定ファイルの構成が簡単という利点もあります。

リバース方向のプロキシサーバとしては他にもSwitchFlow, Perlbal, Nginx, YXORP などもあるようですが、varnishが一番シンプルなように見えましたので選択しました。SwitchFlowはメンテナンスされているのかよく分からない点が不安です。Perlbalperlの方には良いのだろうと思いますが、私は最近はすっかりperlを使っていないので色々と敬遠したいなぁと思いました。Nginxは素敵な雰囲気ですが、HTTPdの機能は不要ですので選択肢に入りませんでした。YXORPはなかなか良さそうですが、とっても多機能なようなので今回は避けました。特に"Multiple listeners: one YXORP can monitor several TCP ports and process incoming traffic"とのことなので大変に便利そうです、いずれ使ってみたいと思います。

インストール

もちろん aptitude でインストールできます。

sudo aptitude install varnish

これでインストールは完了です、とっても楽チン!

設定

私の目的は port 80 でリバースプロキシさんに色々振り分けてもらうことです。まず、port 80 でサーバが起動するように設定しておきます。まずは皆さんの大好きな jed で /etc/default/varnish を編集します。

sudo jed /etc/default/varnish

ここで書き換えなければならないのは VARNISH_LISTEN_PORT です。以下のように80を指定します。

VARNISH_LISTEN_PORT=80

あと、必要があればキャッシュサイズも変更しておくと良いかと思います。

VARNISH_BACKEND_STORAGE_SIZE=20480000

なお varnish は ubuntu 標準では management port として port 6082 あたりで待ち構えますので、その点十分にご注意下さい。戸締り用心のため以下のように /etc/init.d/varnish を書き換えておくことをオススメします。

# -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
# の行を消します。

DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
                -h ${VARNISH_HASHOPTION} \
                -f ${VARNISH_VCL_CONF} \
                -t ${VARNISH_TTL} \
                -w ${VARNISH_MIN_WORKER_THREADS},${VARNISH_MAX_WORKER_THREADS},${VARNISH_WORKER_THREAD_TIMEOUT} \
                -s ${VARNISH_BACKEND_STORAGE}"  

/etc/init.d/varnish を編集するのはとっても行儀が悪いような気がしますが、/etc/default/varnish で VARNISH_ADMIN_LISTEN_ADDRESS, VARNISH_ADMIN_LISTEN_PORT をコメントアウトしても tcp6 でポートを開いてくれたりしますので、油断なさらないように。

では次に /etc/varnish/vcl.conf を編集します。例えば subdomain.example.com に対するアクセスを localhost の port 8000 に振り分けて欲しい場合は、まずbackend 設定を追加します。

backend subdomain {
        set backend.host = "127.0.0.1";
        set backend.port = "8000";       
}

backend設定の次には vcl_recv 内でリクエスト内容によってこれを backend subdomain に振り分けるように指定します。

sub vcl_recv {
  if (req.http.host == "subdomain.example.com") {
    set req.backend = subdomain;
  }
# 以下略

この振り分けの設定には"=="だけでなく、 "~"を用いて正規表現によって振り分けることも出来ますので色々と柔軟な設定が出来ます。とっても簡単で便利ですね! vcl.conf の記法や意味の詳細は man 7 vcl でご覧下さい。

サーバの起動

設定が整いましたので、晴れてサーバを起動してみましょう。

/etc/init.d/varnish start # 既に起動していれば restart

ブラウザでsubdomain.example.comにアクセスし、port 8000 で動いているサーバさんの内容が表示されればOK!

varnishdの管理

動いている varnishd さんと色々と密談したい時には、以下のように telnet を通して語り掛けます。

telnet 127.0.0.1 6082

help するとコマンドリストが表示されます。これに従って適切に色々やって下さい。例えばキャッシュの消去は

url.purge *

みたいな感じで。ただ、これ、認証が一切ないんですけどいいの?マジで?じゃあ一般ユーザがvarnishdを一時停止出来ちゃったりするわけですか。あとなんか色々やると落としちゃったりできるんですけど、どうなの!?ちなみに ubuntu の varnishd は 1.0.3 とちょっと古めなので、そのせいかも知れません。

というわけですから、信頼できないユーザが存在する場合には、念の為に management port を閉じておくのがよろしいかと思います。

感想

varnish、とっても簡単ですね!management port の設定に多少注意が必要なのが面倒っちい感じですが、それでもこの設定の分かり易さと簡単さは大変に素晴らしいことだと思います。そんなわけで皆様、varnish 良いと思います。使いましょう。