2013年8月31日土曜日

CentOS6.4+varnishでリバースプロキシ

動的IP一つで複数ドメインで複数サービスといういかにも弱小な運用することになったのでリバースプロキシを導入することにしました。

一般家庭向けのFTTH1GbpsでもプロバイダがSoftBankなら転送制限は今のところなく、案外安定してサービスを続けられています。(月間100GBは上下してると思います)

ネットワーク帯域は十分、そこそこのスペックのあるサーバ一台毎ににWeb、DB両方入れてサービス運用をしています。

落ちてもそこまで問題の無いサービスなので冗長化は行なっていません。

落としちゃいけないサービスは事務所サーバで運用せずクラウドでやります。そういえばGoogle Computer Engineが楽しみ。

 

とは言ってもいずれやることになるのは目に見えてるのでとりあえずLVSで冗長化の試験を行うことに。

少々躓いたけど無事動いたということでリバースプロキシにしようと思ったらLVSじゃドメインベースの振り分けできないことに気づく。

なにを思ったかL4スイッチだから出来るだろうと確認もせずやってました。

 

しかたないのでHTTPのリバースプロキシを改めて導入することに。

ApacheやPoundやnignxなどなどありますが、今回はリバースプロキシでキャッシュしたりヘッダいじったりしないし、

新たにサーバ新調するのも持ったいないので転がってたMini-ITXのAtomで十分動くであろうvarnishを使うことにしました。

初めてvarnish使ってみましたが、これがなかなか使い勝手がいい!

 

WAN

NVR500(L3)

varnish(L4 or L7)

Web01(hogehoge1.com)  , Web02(hogehoge2.com), othres...

といったネットワーク構成です。サービスが増えたらvarnishもLVSで複数にする予定です。

現在はWebサーバとDBサーバは物理的に同じですが、それもいずれ分離してクラスタする予定。

 

・CentOS6.4にvarnish3.0.1をインストール

 

デフォルトのリポジトリには含まれていないのでrpmを用意

適当に最新版を持ってきます。

$ rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm

$ yum install varnish

デフォルトポートが6081あたりになってるのでhttpdに合わせて変更

$ vi /etc/sysconfig/varnish

#VARNISH_LISTEN_PORT=6081

VARNISH_LISTEN_PORT=80

 

・設定

 

varnishの一番好きなところです。

VCLというドメイン固有言語があり、かなり細かく設定ができます。

でも今回は必要ないので単純にドメインで振り分けする設定です。

 

$ vi /etc/varnish/default.vcl

backend default {

  .host = "127.0.0.1";

  .port = "80";

}

 

backend hogehoge1{

  .host = "192.168.1.10";

  .port = "80";

}

 

backend hogehoge2{

  .host = "192.168.1.11";

  .port = "80";

}

 

sub vcl_recv {

 

  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;

  }

 

  if (req.http.host == "hogehoge1") {

    set req.http.host = "hogehoge1";

    set req.backend = hogehoge1;

  }elseif (req.http.host == "hogehoge2") {

    set req.http.host = "hogehoge2";

    set req.backend = hogehoge2;

  } else {

    error 404 "Unknown virtual host";

  }

}

見たまんまシンプルな設定です。

VCLではこのようにC++ライクに設定がかけます。

0 件のコメント:

コメントを投稿