squidで多段リバースプロキシー

いわゆるproxyはやったことがあるんですが、reverseはApacheとかPoundみたいなお手軽なやつでしかやったことなかったので、squidでreverse proxy(キャッシュサーバ)です。

構成は

  • proxy (carp1, carp2にリクエストを送るバランサー用ホスト)
  • carp1 (ファイルをキャッシュするホストその1)
  • carp2 (ファイルをキャッシュするホストその2)
  • origin (ファイルをストアしているホスト)

となっております。

ホスト名アドレス
proxy192.168.0.200
carp1192.168.0.201
carp2192.168.0.202
origin192.168.0.203

proxyはキャッシュをさせずにcarp1, carp2にリクエストをふります。squidではCARP(Cache Array Routing Protocol)と呼ばれるアルゴリズムにより、リクエストをバランシング(carp1, carp2に振り分け)することが出来るようです。CARPはリクエストURLによってどのホストにリクエストを渡すか決めるようなので、同じファイルは同じホストにリクエストが渡る(常にcarp1, carp2のどちらか決まった方にリクエストがわたる)みたいですね。proxyではこの機能を使います。

carp1, carp2は単純にキャッシングします。キャッシュファイルにCOSS(CyclicObjectStorageSystem)を使うと一つの大きなファイル上にキャッシュを保存する事ができてIO負荷をさげられるそうです。とりあえず今回は使ってません。

各ホストの設定はこんな感じ。例によってXenでやりましたがゲストOSを作る手順は割愛。

インストール

# yum -y install squid

proxy

設定ファイルは/etc/squid/squid.confです。squidは機能が多いこともあってか設定項目が多くて複雑な感じががしますね。

visible_hostname proxy
cache_dir null /dev/null
acl all src 0.0.0.0/0.0.0.0
http_access allow all
http_port 192.168.0.200:80 accel defaultsite=192.168.0.203
cache_peer 192.168.0.201 parent 80 0 proxy-only carp no-query
cache_peer 192.168.0.202 parent 80 0 proxy-only carp no-query

reverse proxyの肝となるのが「cache_peer」の設定です。ということでcache_peerについて軽くまとめておきます。
http://www.squid-cache.org/Doc/config/cache_peer/

cache_peer   hostname   type   proxy port   icp port   options
type

typeは自分がキャッシュを持っていない場合にどの様にフォワードするかを指定するものです。以下の3つから選べるようです。

  • parent
  • sibling
  • multicast

parentは親、siblingは兄弟(並列)、multicastは複数にフォワードするんですかね。結局はフォワードするんだからparentもsiblingも一緒じゃ?と一瞬思いましたが、

  • parentはリクエストをフォワードしてフォワード先にデータがない場合は自分は何もしない(指定したホストが変わりにファイルを探しにいく)
  • siblingはリクエストをフォワードしてフォワード先にデータがない場合は自分でファイルを探しに行く

といった違いがあるようです。(multicastは特殊だと思うので今回はスルーで)

proxy port

プロキシとしてListenしてるポートの番号

icp

icpをListenしているポートの番号。squidはこのicpというプロトコルを用いて他squidホストにキャッシュがあるかどうかなどの確認を行うみたいです。「0」を指定すると無効にできる様

options

読んで時のごとくオプション。項目はいっぱいあります。

  • proxy-only 指定したホストからのデータをローカルにキャッシュしない
  • no-query 指定したホストへicpのパケットを送らない
  • carp carpアルゴリズムを用いてバランシングする

などなど

carp1, carp2

carp1
visible_hostname carp1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
http_port 192.168.0.201:80 accel defaultsite=192.168.0.203
access_log /var/log/squid/access.log squid
cache_peer 192.168.0.203 parent 80 0 no-query originserver
carp2
visible_hostname carp2
acl all src 0.0.0.0/0.0.0.0
http_access allow all
http_port 192.168.0.202:80 accel defaultsite=192.168.0.203
access_log /var/log/squid/access.log squid
cache_peer 192.168.0.203 parent 80 0 no-query originserver

今回は使っていませんが、「cache_dir」を使えばキャッシュの保存先の指定ができるようです。同様にCOSSを使う場合もこの項目で指定するようです。デフォルトの保存先は/var/spool/squid以下です。

origin

普通にApacheを立ててコンテンツを置く。



こんな感じで出来ました。ちなみに下記のようなPathでファイルを作ってブラウザからみるとリクエストがバランシングされてるのが確認できました。いくつかのファイルを試しましたが、同じディレクトリにあるファイルは同じホストに行ってしまうようです。これだと偏りができてしまいそうだなぁ。

  • /var/www/html/index.html -> carp1
  • /var/www/html/test/test.html -> carp2