Apacheはとてもとても有名なWeb Serverですが、今日はそのチューニング方法の一つであるリバースプロキシについて書きたいと思います。
Webサーバの種類
一口にWebサーバと言っても、ダイナミックなWebコンテンツを生成するサイトにおいてWebサーバがserveするものは2種類あります。一つはプログラムで動的に生成されるHTMLファイル。もう一つがGIFやJPEG, PNGなどの画像、および Flash, JavaScript, CSSなどの静的なファイルです。
プログラムで動的にHTMLを生成するためには、そのプログラムを動かす実行環境がWebサーバ(Apache)と連携する必要があります。いわゆるCGIとか最近だとFastCGI, mod_php, mod_perl, mod_rails, mod_pythonなどのスクリプト環境がよく使われています。これらの環境は昨今では「事前に実行環境(インタープリター)の起動をしてプログラムをコンパイルしておきそれを再利用する」というような使われ方をするため、Apacheがクライアントからの要求を処理するために生成する子プロセスのメモリ使用量が肥大化し、プロセスを起動する処理が重くなる傾向にあります。
一方で、単純にファイルの中身をそのままクライアントに渡せばいいようなスタティックなファイルが、このような肥大化したプロセスで処理されることには非常に無駄があります。そこでリバースプロキシの出番です。リバースプロキシの動作は凄くシンプルで、リクエストを受けたら、ダイナミックなページのリクエストのみバックエンドのアプリケーションサーバに渡し、それ以外のスタティックなファイルは自分自身で直接処理します(*1)。図にするとこんな感じでしょうか。
このような単純な動作なので、リバースプロキシ自体にはmod_perlやmod_phpなどを組み込む必要がなくなり、プロセスのサイズは非常にスリムになります。実際このブログを動かしているマシンでも
- リバースプロキシのプロセスサイズは3.5MB程度
- mod_phpのプロセスサイズは25MB程度
となっており、一プロセスあたりで20MBも違います。
さらに、リバースプロキシは動作がシンプルなので、ApacheのMPM(Multi-Proccessing Module)にworkerというものを選択することができます。worker mpmはクライアントからのリクエストを処理するのにプロセスより軽量なスレッドを使用するため(*2)、prefork mpmと比べて動作が軽いという特徴があります。
*1)これは設定自体でどうにでも変更できます
*2)厳密に言うとプロセス+スレッドのハイブリッド方式です
また、フロントエンドのリバースプロキシ+バックエンドのアプリケーションサーバという構成にしておくことで、リバースプロキシは止めずにバックエンドのサーバを増やしたり交換したりすることが可能です。このため負荷分散のためのメンテナンスが非常にやりやすくなります。このあたりはmod_proxy_balancerというモジュールの話になるので今回は割愛しますが、また機会があればということで。
Apache 2.2.11のインストール
前置きが長くなりましたが、リバースプロキシを導入するメリットがわかったところで実際にApacheをインストールしてみたいと思います。環境は Ubuntu 8.10 Interpid です。
まずは最新版である2.2.11のソースを Apache本家 からダウンロードしておきます。
$ tar xvzf httpd-2.2.11.tar.gz
# ちょっとでも最適化する
$ export CFLAGS="-O3"
$ cd httpd-2.2.11
$ ./configure --prefix=/usr/local/httpd_proxy_2.2.11
--with-mpm=worker
--enable-shared
--enable-so
--disable-asis
--disable-cgid
--disable-proxy-connect
--disable-proxy-ftp
--disable-proxy-ajp
--disable-userdir
--disable-actions
--enable-modules='rewrite proxy proxy_balancer proxy_http cgi deflate headers expires'
--enable-mods-shared='ssl cache disk_cache mem_cache'
&& make && sudo make install
でインストールが完了です。configureにいろいろとオプションを渡していますが、これらは
- 確実に使用するモジュールを静的にリンクさせる
- 不要なモジュールは無効にする
- 必要になるかもしれないモジュールはDSOとして組み込めるようにしておく
という指定です。/usr/local/httpd_proxy_2.2.11 にApacheのファイル一式がインストールされているので、起動確認を行いましょう。
$ sudo /usr/local/httpd_proxy_2.2.11/bin/apachectl start
でサーバが起動するので、http://localhost/ にアクセスしてみてください。"It works!"と表示されればインストール成功です。次回は具体的なリバースプロキシの設定方法を説明します。