squidで多段リバースプロキシー
いわゆるproxyはやったことがあるんですが、reverseはApacheとかPoundみたいなお手軽なやつでしかやったことなかったので、squidでreverse proxy(キャッシュサーバ)です。
構成は
- proxy (carp1, carp2にリクエストを送るバランサー用ホスト)
- carp1 (ファイルをキャッシュするホストその1)
- carp2 (ファイルをキャッシュするホストその2)
- origin (ファイルをストアしているホスト)
となっております。
ホスト名 | アドレス |
---|---|
proxy | 192.168.0.200 |
carp1 | 192.168.0.201 |
carp2 | 192.168.0.202 |
origin | 192.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を作る手順は割愛。
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以下です。