Apacheのmod_proxyモジュールを使ってWebの負荷分散を行う

mod_proxyで負荷分散 (ProxyPassReverse)

概要

自宅サーバ(Webサーバ)で,WikiのCGI(PyukiWiki)やら何やら動かしていると,パワー不足を感じるようになってきた. Wikiの少し凝ったページ(具体的にはこのBugTrack)を表示しようとすると, 少し待たされるという状態になってしまった.

そこで,Wikiの処理については自宅LAN内にある別のマシンに任せることで, レスポンスの改善を図った.

今回の方法

インターネットに公開しているのはサーバAだけだが,

構成図

サーバBが高スペックなマシンなので,こいつにWikiの処理を任せることにする.

インターネットから入ってきたリクエストのうち,http://www.rensa.info/wiki/* 宛のリクエストを,Apacheのmod_proxyを使ってサーバBに転送する.

そして,サーバB上でWikiの重い処理を実行してレスポンス(Webページ)を生成してサーバAに返し, それをブラウザへ返すという流れになる.

別案 (参考)

なお,このように別のサーバへ処理を依頼するには,今回使わなかったが他の方法も存在する. stoneなどのリピータソフトを使って,リクエストを転送することも可能である.

具体的には,

  1. サーバAのApacheでmod_rewriteを使って,http://www.rensa.info/wiki/ へのリクエストを,別ポートへのリクエスト(例:http://www.rensa.info:8001)へ書き換える
  2. するとブラウザから,http://www.rensa.info:8001 へのリクエストが再来するので,stone(サーバA上で稼働)を使って,サーバA:8001 → サーバB:80 へ転送する
  3. サーバBで,転送されてきたリクエスト(Wiki宛)を処理して,結果を返す

という方法.

しかしこの方法は,ブラウザから http://www.rensa.info:8001 へのリクエストを投げさせてしまうという欠点がある.

利用者の環境によっては,ブラウザからポート8001への接続ができない場合が十分あり得る. 特にプロキシ経由だと,接続できない可能性が高い.

なので今回はこの方法は使わず,mod_proxyを使うことにした.


Apache mod_proxyの準備

Apacheに,mod_proxyが入っていないことには話にならない.

make前のconfigureを,--enable-proxy を付けて行えばよい.


Apacheの設定

httpd.confの抜粋 - サーバA

<Location /wiki>
   ProxyPass http://server-b/rensawiki
   ProxyPassReverse http://server-b/rensawiki
</Location>
サーバAに来た /wiki へのリクエストを,サーバB(server-b)へ中継する.

サーバBでは,http://server-b/rensawiki/ というURLでWiki宛のリクエストを受け付けるような設定にしている.

httpd.confの抜粋 - サーバB

Alias /rensawiki /var/www/wiki
<Directory /var/www/wiki/>
   DirectoryIndex wiki.cgi
   Options ExecCGI
   AllowOverride None
</Directory>
こちらの内容は,実はmod_proxyとは全然関係ない.

サーバAから中継されてくるWiki宛のリクエストが /rensawiki で来るので, /rensawiki に対してAliasを設定してますよという程度の内容だ.

以上で,あっけなく作業終了.


© 2024 KMIソフトウェア