3月 252009
 

Proxy サーバ、何が一番良いのだろう?と、思い、まず、パッとひらめいたのが squid だったので、それを利用して Proxy サーバを構築してみた。ふむ。設定を施した後はちゃんと動作してキャッシュも溜まっていくねぇ。と言う感じだったのだけど・・。

ps で確認してみると squid は一個のプロセスでしか動作していない。でもってマルチスレッドにもなっていないので、ふと「これで同時にたくさんのアクセスがあった場合どうなるんだ?」とか思い調べてみると・・。あぁら。squid はファイルハンドラがボトルネックになって大規模な運用を行うのには向いてないのねぇ(そら、squid サーバを複数台立てれば大規模サイトの運用できるのは解るけど、全然現実的しゃないじゃん;-()。というのが発覚。

default で 1024 個のファイルハンドラしか無い状態で一個の接続に三つのファイルハンドラを利用するとなると同時に接続できるのは 300 個のクライアントじゃん。ダメだこら。と言うことで別の Proxy サーバを探し始めます。

続いてトライしたのが apache の 2.2.9 。まぁ、大規模環境において動けば良いのでねぇ。他にも色々あるみたいだけど、勝手知ったると言うか・・(^^;;。

Proxy サーバと、後、キャッシュサーバとしてのみ動作させるので要らない機能は落とします。configure 時のオプションはこんな感じ。–with-mpm=worker を付けたのでスレッドな httpd として動作します。

$ ./configure --enable-headers --enable-so
--with-mpm=worker
--disable-cgi --disable-cgid --disable-userdir
--enable-proxy --enable-proxy-ftp --enable-proxy-http --enable-proxy-connect
--enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache

 
さてと。インストールが終わっていよいよ設定ですが、今回は以下のようにします。

・192.168.1.200 で動作しているサーバの情報をキャッシュするための Proxy サーバを構築します。
・Proxy サーバに対して port:8080 でアクセスした場合はキャッシュしません。
・Proxy サーバに対して port:8081 でアクセスした場合はキャッシュして、その情報を利用するようにします。

オープン Proxy サーバとならないように 192.168.1.200 にのみアクセス可能なサーバとします。これでどこから接続があってもまるで利用できないものとなりますし;-)。

で、設定は大体こんな感じなのだけど、一番苦労した点が、port:8080 にアクセスした場合にキャッシュしないもしくはキャッシュ情報を利用しないで、port:8081にアクセスがあった場合はキャッシュを利用するもしくは新規に取ってきた情報をキャッシュするように動作する設定でした。

<IfModule mod_proxy.c>
    ProxyRequests Off
    ProxyVia On
    AllowCONNECT 8080 8081
<Proxy *:8080> Order deny,allow # Deny from all Allow from all </Proxy>
<Proxy *:8081> Order deny,allow # Deny from all Allow from all </Proxy>
<VirtualHost *:8080> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> CacheDisable / </IfModule> </VirtualHost>
<VirtualHost *:8081> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> <IfModule mod_disk_cache.c> CacheRoot /data/httpd/cache/ CacheEnable disk / CacheMaxExpire 5184000 CacheDefaultExpire 5184000 CacheDirLevels 3 CacheDirLength 5 </IfModule>
<IfModule mod_mem_cache.c> CacheEnable mem / MCacheSize 2048000 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 10240000 </IfModule> </IfModule> </VirtualHost> </IfModule>

 
Proxy ディレクティブはアクセス制限のためにしか書けないのねぇ。けっこう悲しい。僕的には <Proxy *:8080> の中に mod_cache の情報が書けるとすごーい嬉しいと思ったのだけど・・。

しょーがないので VirtualHost ディレクティブを記述して、そこで port をわけて、一個は CacheDisable、もう一個の 8081 では CacheEnable を記述すると言う、非常にややこしい設定となってしまいました。まぁ、それが apache の設定だぜぃ。と言われればその通りで、この設定をパッと思いついてしまう自分もすっかりと apache に染まっているのだなぁ(自慢か?;-P)と思ってしまうのだけど・・。

個別の設定については詳しい説明は書きませんので apache.orgのドキュメントを参照してください。

今回やりたかったのは、キャッシュを利用するポートとキャッシュを利用しないポートでサービスができる Proxy サーバが欲しかった。と言う感じでしょうか。

  8 件のコメント to “apache で Proxy を作ってみた。”

  1. CacheEnableで”disk /”と”mem /”の両方を書いているけれど、これどちらが使われているの?両方?それとも先に書いてある方?

  2. うひっ。僕は両方使えると思っているんですけどねぇ。
    メモリ上に保存できるファイルのサイズが指定してあるのですが、それ以外のやつは disk に保存されるのだろう。と勝手に思っています。
    けど、確認してみたところちっこいファイルもディスクに保存されているんですよねぇ・・。
    と、言うことで明日もう一度確認してみます。

  3. こんにちわー。ドキュメントを読み直してみました。
    ここに書いてありますねぇ。
    「ストレージ管理方式が実行される順番は設定ファイル中の CacheEnable の順番により決定されます。」
    と、書いてあるので、上から順番に処理されるみたいです。するっていと、僕の設定ではメモリは利用されないことになるので、 mod_mem_cache を先に書いて、サイズを超えたら disk を使うようにするために mod_disk_cache と mod_mem_cache の順番を逆にする必要がありそうです。
    コメントありがとうございました。おかげて気がつくことができましたm(_ _)m。

  4. おお、勉強になりました!
    ボクはどれか1つしか使えないと思い込んでいたので、mem_cache だけ指定していました。
    順番に処理してくれるんですねぇ。
    うちのも直そう。

  5. あーうー。ウソ書きました・・。
    コメント書いた後じっくりドキュメント読んだら、mod_mem_cache は指定したファイル数を超えると古いのから消していくみたいです。なので disk は多分永遠に使われないことでしょう・・。
    なので、僕の設定から mod_mem_cache はコメントアウトしました・・。
    どうも済みませんでした・・。けど、apache のサイトのサンプル config には両方書いてあるのはナゼ?

  6. ふ~む。
    もしかして、
    MCacheMinObjectSize より小さい、
    もしくは、
    MCacheMaxObjectSize より大きい、
    ければ、mod_mem_cache はスルー判定されて disk が使われるのでは?
    試してみて~;-P

  7. apache で Proxy を作ってみた。(2)

    前回書いた続編と言うか・・。 一応、apache を Proxy として利用でき…

  8. apache で Proxy を作ってみた。(3)

    まさか三回目を書くとは思いもしませんでした・・。apache ベースで作成したキ…

 コメントを書いてください。

HTML タグが利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

(必須項目)

(必須項目)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

This site uses Akismet to reduce spam. Learn how your comment data is processed.