FastCGIとは、Webサーバ上でユーザプログラムを動作させるためのインタフェース仕様の一つである。CGIの問題を解決するためにOpen Market社によって1990年代中頃に開発されたもので、仕様は公開されている。
概要(従来のCGIの問題点)
歴史
CGIのスケーラビリティの欠点に対処するために、Open Market はFastCGI を開発し、1990年代中頃に最初にWebサーバ製品に導入した。Open Market は当初、Webアプリケーションを開発するためのNetscape独自のインプロセスAPI(Netscapeサーバアプリケーションプログラミングインターフェイス(NSAPI))に対する競争力のある対応としてFastCGIを開発した。 最初はOpen Market によって開発されたが、FastCGI は他のいくつかのWebサーバメーカーによって実装された。ただし、そのアプローチは、サーバとサブプログラム間の通信を高速化および簡素化する他の方法と競合した。mod_perlやmod_php等のApache HTTP Serverモジュールがほぼ同時期に登場し、急速に普及した。2019年現在、CGIを含むこれら様々な方法は引き続き使用されている。
詳細
リクエスト毎に新しいプロセスを作成する代わりに、FastCGI は永続的なプロセスを使用して一連のリクエストを処理する。これらのプロセスは、WebサーバではなくFastCGI サーバが所有している。
受信リクエストを処理するために、Webサーバは環境変数情報とページリクエストを、UNIXドメインソケット、名前付きパイプ、または伝送制御プロトコル(TCP)接続のいずれかを介してFastCGI プロセスに送信する。応答は同じ接続を介してプロセスからWebサーバに返され、Webサーバはその応答をエンドユーザに配信する。応答の最後に接続が閉じられる可能性があるが、WebサーバとFastCGI サービスプロセスの両方が存続する。
個々のFastCGI プロセスは、その存続期間中に多くの要求を処理できるため、要求毎のプロセスの作成と終了のオーバーヘッドを回避できる。複数の要求を同時に処理するには、いくつかの方法がある。1つの接続を内部多重化(つまり、1つの接続で複数の要求)を使用して行う、複数の接続を使用する、またはこれらの方法の組み合わせによる方法がある。複数のFastCGI サーバを構成できるため、安定性とスケーラビリティが向上する。
Webサイトの管理者とプログラマは、FastCGI でWebサーバからWebアプリケーションを分離すると、組み込みインタプリタ(mod_perlやmod_php等)に比べて多くの利点がある。この分離により、サーバプロセスとアプリケーションプロセスを個別に再起動できる。これは、多忙なWebサイトにとって重要な考慮事項である。また、ISPやWebホスティング会社にとって重要な要件である、アプリケーションごとのホスティングサービスセキュリティポリシーの実装も可能になる。様々なタイプの着信要求を、それらのタイプの要求を効率的に処理するように装備されている特定のFastCGI サーバに配布できる。
FastCGI を実装するWebサーバ
参考: Webサーバソフトウェアの比較#機能
注: 特に明記しない限り、FastCGI 実装の完全性は不明
- Apache HTTP Server(部分的)
mod_fcgidによって実装されている。このモジュールは以前はサードパーティだったが、Chris Darroch によって統括された2009年にApache ServerのサブプロジェクトとしてApacheソフトウェア財団(ASF)に寄贈された。UNIXドメインソケットのみをサポートし、TCP ソケットはサポートしない。- サードパーティのモジュール
mod_fastcgiも使用される。しばらくの間、このモジュールはApache 2.4.xで適切にコンパイルされなかった。その問題は元のプロジェクトのフォークで解決された。 - 1つの接続を介したリクエストの多重化は、Apache 1.x 設計によって禁止されているため、これはサポートされていない
- Apache 2.4では、
mod_proxy_fcgiが追加され、TCP FastCGI サーバをサポートしている。
- Caddy
- Cherokee
- Hiawatha
- ロードバランシングFastCGI サポート
- chroot されたFastCGI サーバをサポート
- Jetty
- Kerio WebSTAR
- Lighttpd
- LiteSpeed Web Server
- Microsoft IIS
- nginx
- NaviServer
- Oracle iPlanet Web Server
- OpenBSDの
httpd(8) - Open MarketWebサーバ
- ResinWebサーバおよびWebアプリケーション
- RoxenWebサーバ
- ShimmerCatWebサーバ
- Zeus Web Server
API言語バインディング
FastCGI は、ネットワークソケットをサポートする任意の言語で実装できる。「FastCGI はプロトコルであり、実装ではない」ため、1つの言語に強く拘束されていない。アプリケーションプログラミングインターフェイス(API)は、次のものに対して存在する:
- Ada
- Delphi, Lazarus, Free Pascal
- C言語、C++
- Chicken (Scheme)
- Common Lisp
- D言語
- Eiffel
- Erlang
- GnuCOBOL
- Go
- Guile Scheme
- Haskell
- HP BASIC for OpenVMS
- Java
- Lua
- node.js
- OCaml
- Perl
- PHP(
php-fpm経由、HipHop for PHP) - Python
- Ruby
- Rust
- SmartEiffel
- Smalltalk: FasTalk およびDolphin Smalltalk
- Tcl
- WebDNA
- Vala(C言語バインディング)
- Xojo(以前はRealbasic, REAL Studio)
Ruby on Rails, Catalyst, Django, Kepler、Plack等の最近のフレームワークでは、組み込みインタープリタ(mod_ruby, mod_perl, mod_python, mod_lua等)、またはFastCGI を使用できる。
FastCGI が適用できない言語の一つはシェルスクリプトである。一部のシェルの実装では POSIX では規定されてない拡張機能として最低限のネットワークソケットをサポートしてはいるが、言語上の制限が大きく実装が困難なため API 言語バインディングが存在しない。また FastCGI は新しいプロセスを作成しないことで要求毎のオーバーヘッドを回避するのが目的であるが、シェルスクリプトでは多数の外部コマンドを呼び出すことで処理を行うプロセスを多数作成するプログラミングスタイルとなるため、たとえ FastCGI が使えたとしても要求毎のプロセス生成をたかだか 1 つ減らせる程度となり FastCGI のオーバーヘッドの回避の効果は限りなくゼロに近い。