WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Web サーバーの構築 : FastCGI をサポートする

本日は、久々に Web サーバーの機能を強化してみようと思います(^^;。具体的には、 FastCGI のサポートを組み込みます。FastCGI とは、 Web サーバーで CGI の処理を効率よく行うための仕組みです。詳細は後述しますが、リクエストのたびに CGI プログラムを起動しなければならないという従来の CGI の非効率性を排除することで、 CGI 処理の負荷とレスポンスを大幅に向上します。とくに Ruby on Rails で作成したWebアプリケーションを実用的に稼動させるには、ほぼ必須の機能となります。

そのようなわけで、本日は GentooLinux にインストールした ApacheFastCGI を利用する方法をご紹介したいと思います。

FastCGI の詳細

まず最初に、 FastCGI とはなにか、という点についてご紹介しておきましょう。そのためには、従来の CGI の欠点を知らなければなりません。 CGI は動的な Web ページを生成するためになくてはならない仕組みですが、処理負荷が重いという欠点があります。その主な原因は、リクエストを受け取るたびに CGI プログラムを新たに起動しなければならないというところにあります。プロセスの起動にももちろん時間がかかりますし、 CGI プログラム内の初期化処理も毎回実行しなければなりません。 Ruby on Rails のようなフレームワークを使う場合はとくに影響が顕著になります。

それらを改善するためにまず最初に考え出されたのが、スクリプト言語を Web サーバーの拡張モジュールとして実装する方法でした。 PHP などはまさにそこから生まれた言語ですね。この方法ならプロセスを生成せずにスクリプトを実行できるのでレスポンスの問題は改善されます。しかし、この方法はいくつかの新しい問題を生み出しました。まずひとつは、スクリプト言語の処理系が Web サーバーに依存してしまうという点です。拡張モジュールのインターフェースは Web サーバーごとに異なりますので、サポートする Web サーバーを限定せざるをえません。さらに大きな問題として、スクリプトの実行が Web サーバーと同じプロセスで実行されるため、セキュリティーが低下する点があります。もしスクリプトに脆弱性があった場合、 Web サーバー全体が影響を受けてしまいます。

そこで、これらの問題を回避しつつ CGI の処理負荷を軽減する仕組みとして注目されているのが FastCGI です。 FastCGI では、あらかじめ複数の CGI プロセスを待機状態で起動しておきます。そしてリクエストがあったときにその中のひとつをアクティベートしてスクリプトを実行し、結果をクライアントに返します。そして実行し終わったプロセスは再び待機状態になり、リクエストを待ちます。新たにプロセスを生成しないので処理負荷が軽減され、しかも CGI は独立したプロセスで実行されるためにセキュリティー的にも従来の CGI と変わりません。 Web サーバーと CGI プログラムの双方が FastCGI をサポートする必要はありますが、 FastCGI のインターフェースは共通であるため、 Web サーバーごとに個別対応する必要はありません。 FastCGI 対応の CGI プログラムは、すべての FastCGI 対応 Web サーバーで実行できます(理論上は、ですが ^^;)。また、通常の CGI プログラムを FastCGI に対応させるラッパーも用意されているようです。

規模の大きな CGI プログラムを実行する際には、 FastCGI はぜひとも有効にしておきたい機能です。 ApacheFastCGI をサポートするには、 mod_fastcgi, mod_fcgid, mod_proxy_fcgi といった拡張モジュールをインストールする必要があります。 mod_fastcgi は残念ながら Apache 2.0 とは相性が悪く、 mod_proxy_fcgiGentooLinux のパッケージが用意されていないので、今回は mod_fcgid を使うことにします。

mod_fcgid のインストール

ちょっと前置きが長くなりましたが、 mod_fcgid のインストールを始めましょう。 GentooLinux ではパッケージが用意されていますので、それを使います。以下のコマンドを実行するだけでインストールできます。

emerge www-apache/mod_fcgid

GentooLinux では、拡張モジュールの有効・無効を Apache 起動時のオプションで定数を定義することによって行うようになっています。 mod_fcgid の場合は "-D FCGID" というオプションを追加することで有効化できます。 "/etc/conf.d/apache2" で定義されている APACHE2_OPTS に追加すると良いでしょう。例えば、以下のように記述します。

APACHE2_OPTS="-D FCGID -D DEFAULT_VHOST"

もちろん他の拡張モジュール(PHP など)を使っている場合はその記述も加えなければなりません。適宜読み替えてください。

設定が終わったら、 Apache を再起動しましょう。

/etc/init.d/apache2 restart

これで FastCGI が有効になりました。

各パッケージの FastCGI サポートを有効にする

GentooLinux では、 fastcgi USEフラグを指定することによって各パッケージの FastCGI サポートを有効にすることができます。 FastCGI をサポートしたWebアプリケーションなどをインストールしている場合は以下の手順で再構築しましょう。

まず、 fastcgi USEフラグを有効にするために "/etc/make.conf" を編集します。 環境変数 USE に以下のように設定します。

USE="fastcgi ..."

"..." は既存のUSEフラグです(^^;。 USEフラグを指定したら、関連するパッケージを再構築します。以下のコマンドを実行すれば OK です。

emerge --update --deep --newuse world

既存のパッケージを利用するのではなく、自作の CGIFastCGI を使う場合や、 Portage を使わずにWebアプリケーションをインストールした場合は、手動で必要なライブラリをインストールする必要があるかもしれません。ざっと探したところ、各言語用に以下の ebuild が用意されているようです。

ebuild 機能
dev-libs/fcgi C/C++ 用のライブラリ
dev-ruby/ruby-fcgi Ruby 用のライブラリ
dev-python/jonpy Python 用のライブラリ
dev-perl/FCGI Perl 用のライブラリ

これらの中から使用する言語のライブラリをインストールすると良いでしょう。

mod_fcgid の設定変更

mod_fcgid には、プロセスをタイムアウトさせる秒数やプールするプロセス数の制御など、多数の設定があります。詳細はmod_fcgid の公式ページをご参照ください。通常はデフォルトのままでもじゅうぶんですが、パフォーマンスチューニングなどでこれらをカスタマイズする場合は "/etc/apache2/modules.d/20_mod_fcgid.conf" に記述するのがよいと思います。

以上、本日は FastCGI の利用方法についてご紹介しました。今後は徐々に FastCGI が従来の CGI を置き換えていくものと思いますので、今のうちに導入してしまうのが吉でしょう。まだインストールしていない方は、ぜひ挑戦してみてください。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles