FastCGI

FastCGIとは、Webサーバ上でユーザプログラムを動作させるためのインタフェース仕様の一つである。CGIの問題を解決するためにOpen Market社によって1990年代中頃に開発されたもので、仕様は公開されている。

**概要(従来のCGIの問題点)**
CGIは、外部アプリケーションをWebサーバに接続するためのプロトコルである。CGIアプリケーションは個別のプロセスで実行され、各リクエストの開始時に作成され、終了時に破棄される。この「リクエスト毎に1つの新しいプロセス」モデルにより、CGIプログラムの実装が非常に簡単になるが、効率とスケーラビリティが制限される。高負荷では、プロセスの作成と破棄のためのオペレーティングシステムのオーバーヘッドが大きくなる。また、CGIプロセスモデルは、データベース接続の再利用、インメモリキャッシング等のリソース再利用方法を制限する。

**歴史**
CGIのスケーラビリティの欠点に対処するために、Open Market はFastCGI を開発し、1990年代中頃に最初にWebサーバ製品に導入した。Open Market は当初、Webアプリケーションを開発するためのNetscape独自のインプロセスAPI(label=(NSAPI))に対する競争力のある対応としてFastCGIを開発した。 
最初はOpen Market によって開発されたが、FastCGI は他のいくつかのWebサーバメーカーによって実装された。ただし、そのアプローチは、サーバとサブプログラム間の通信を高速化および簡素化する他の方法と競合した。label=やlabel=等のApache HTTP Serverモジュールがほぼ同時期に登場し、急速に普及した。2019年現在、CGIを含むこれら様々な方法は引き続き使用されている。 

**詳細**
リクエスト毎に新しいプロセスを作成する代わりに、FastCGI は永続的なプロセスを使用して一連のリクエストを処理する。これらのプロセスは、WebサーバではなくFastCGI サーバが所有している。
受信リクエストを処理するために、Webサーバは環境変数情報とページリクエストを、UNIXドメインソケット、名前付きパイプ、または伝送制御プロトコル(TCP)接続のいずれかを介してFastCGI プロセスに送信する。応答は同じ接続を介してプロセスからWebサーバに返され、Webサーバはその応答をエンドユーザに配信する。応答の最後に接続が閉じられる可能性があるが、WebサーバとFastCGI サービスプロセスの両方が存続する。
個々のFastCGI プロセスは、その存続期間中に多くの要求を処理できるため、要求毎のプロセスの作成と終了のオーバーヘッドを回避できる。複数の要求を同時に処理するには、いくつかの方法がある。1つの接続を内部多重化(つまり、1つの接続で複数の要求)を使用して行う、複数の接続を使用する、またはこれらの方法の組み合わせによる方法がある。複数のFastCGI サーバを構成できるため、安定性とスケーラビリティが向上する。 
Webサイトの管理者とプログラマは、FastCGI でWebサーバからWebアプリケーションを分離すると、組み込みインタプリタ(label=やlabel=等)に比べて多くの利点がある。この分離により、サーバプロセスとアプリケーションプロセスを個別に再起動できる。これは、多忙なWebサイトにとって重要な考慮事項である。また、ISPやWebホスティング会社にとって重要な要件である、アプリケーションごとのホスティングサービスセキュリティポリシーの実装も可能になる。様々なタイプの着信要求を、それらのタイプの要求を効率的に処理するように装備されている特定のFastCGI サーバに配布できる。 

**FastCGI を実装するWebサーバ**
参考: label=
注: 特に明記しない限り、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- label=- label=
** ロードバランシングFastCGI サポート
** chroot されたFastCGI サーバをサポート- Jetty- label=- Lighttpd- label=- Microsoft IIS- nginx- label=- Oracle iPlanet Web Server- OpenBSDのhttpd(8)- label=Webサーバ- label=WebサーバおよびWebアプリケーション- label=Webサーバ- label=Webサーバ- label=

**API言語バインディング**
FastCGI は、ネットワークソケットをサポートする任意の言語で実装できる。「FastCGI はプロトコルであり、実装ではない」ため、1つの言語に強く拘束されていない。アプリケーションプログラミングインターフェイス(API)は、次のものに対して存在する:- Ada- Delphi, Lazarus, Free Pascal- C言語、C++- Chicken (Scheme)- Common Lisp- D言語- Eiffel- Erlang- GnuCOBOL- Go- Guile Scheme- Haskell- label=- Java- Lua- node.js- OCaml- Perl- PHP(php-fpm経由、label=)- Python- Ruby- Rust- label=- Smalltalk: FasTalk およびlabel=- Tcl- label=- Vala(C言語バインディング)- Xojo(以前はRealbasic, REAL Studio)
Ruby on Rails, Catalyst, Django, label=Kepler、Plack (software)等の最近のフレームワークでは、組み込みインタープリタ(mod_ruby, mod_perl, mod_python, Kepler (software)等)、またはFastCGI を使用できる。
FastCGI が適用できない言語の一つはシェルスクリプトである。一部のシェルの実装では POSIX では規定されてない拡張機能として最低限のネットワークソケットをサポートしてはいるが、言語上の制限が大きく実装が困難なため API 言語バインディングが存在しない。また FastCGI は新しいプロセスを作成しないことで要求毎のオーバーヘッドを回避するのが目的であるが、シェルスクリプトでは多数の外部コマンドを呼び出すことで処理を行うプロセスを多数作成するプログラミングスタイルとなるため、たとえ FastCGI が使えたとしても要求毎のプロセス生成をたかだか 1 つ減らせる程度となり FastCGI のオーバーヘッドの回避の効果は限りなくゼロに近い。

**脚注**

**出典**

**関連項目**
 CGI

**外部リンク**
 公式サイト:  FastCGI.com Archive
** 仕様:  FastCGI Specification
*** セカンダリバックアップ- README for mod_fastcgi- mod_fcgid - FastCGI interface module for Apache 2 - The Apache HTTP Server Project- Installing PHP on Windows Vista with FastCGI | Microsoft Docs- Proxy FastCGI Scheme Apache Module | “mod_proxy_fcgi” is an Apache v2.0 proxy sheme module that implement “fcgi:” scheme to handle reverse proxy protocole FastCGI.