Common Gateway Interface
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Common Gateway Interface (コモン・ゲートウェイ・インタフェース、CGI)は、ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。
ウェブサーバプログラムの機能の主体は、あらかじめ用意された情報を利用者(クライアント)の要求に応じて送り返すことである。そのためサーバプログラム単体では情報をその場で動的に生成してクライアントに送信するような仕組みを作ることはできなかった。 そこで、サーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する方法が考案された。それを実現するためのサーバプログラムと外部プログラムとの連携法の取り決めがCGIである。
CGIを用いるプログラムとしてはどのようなプログラミング言語等で記述することもできるが、C言語やPerlが使われることが多かった[要出典]。近年では、PHPやPython、Rubyなども使われている。
電子掲示板やアクセスカウンタ、WikiやBlogシステムなどを作る目的でCGIを用いることがある。これらはいずれも利用者の書き込みやアクセスによって表示内容が変わっていく動的なものであるため、CGIのような技術が必要になる(ただし、現在ではCGI以外の技術で作ることが可能になっている)。
Webサーバにプロセスを常駐させておくことによりパフォーマンスを向上させるJava Servletやmod_perl、mod_php、FastCGIなどの技術の出現しているが、これらのうちJava Servlet、mod_perl、mod_phpはCGIとは仕組みが異なる競合技術である。
目次 |
[編集] CGIに関する誤解
1990年代後半、CGIを使うプログラムには主にPerlが使われていた。また、C言語はPerlよりも難しいという印象がある他、適切なプログラミングを行わないとメモリリークが発生することや、事前にコンパイルが必要であることなどが理由で、多くの個人ウェブサイト用レンタルサーバでは使用を許可していないこともある。レンタルサーバーの宣伝文句に「CGI利用可能」とあれば、暗黙的にPerlによるCGIを指している事がある。
このことが原因で「CGIとはPerlのことである」と誤解してしまう人が後を立たなかった。
[編集] パフォーマンス
Java Servlet, JSPが登場してから、CGIはServletやJSPよりも、2倍~10倍くらい遅くなり、淘汰されようとしていた時期があった。これは、CGIが、クライアントからのレスポンスを受け取るたびにCGIプログラムとプロセスが起動し、CGIプログラムの実行が終了すると、プロセスも終了するという効率が悪いものであることがServletよりも遅い原因の一つであった。Servletは、初回にプログラムを起動するとプロセスを常駐できたため、あの遅いと言われていたJava言語で書かれたプログラムがCGIで動かすPerlで書かれたプログラムよりも10倍近く高速になったことがまずあげられる。CGIがServletよりも遅かったもう一つの原因はCGIに主に使われているPerlやCGIスクリプトがインタプリタ方式であり、コンパイルされるJavaプログラムよりも低速になるという点であった。
しかし、後にFastCGIの技術の登場によりパフォーマンスは改善され、再びJava Servlet, JSPに追いついた。現在では、サーバからクライアントに単純にダウンロードするだけのレスポンス性能や単純なスクリプトではServletよりも勝っている。しかし、クライアント - サーバ間を頻繁に通信する時やスループット性能に関しては、最適化技術が進んだJavaの上で走るServletと、初回起動時は最適化のために遅くなるものの、Javaは起動後徐々に高速化するため、CGIとServletを比較できる速度の優劣が決定的ではなくなっている。むしろ、CGI + PerlのほうがSerlvetよりも少ないメモリで動作するという大きなアドバンテージがあり、それが、未だにServletに対応しているものレンタルサーバが少なく、メモリコストのかからないCGIやPHPがレンタルサーバにより多く使われていることに繋がっている。
[編集] 仕様
CGIの仕様はNCSAにより最初に定義・実装され、現在の最新版はCGI1.1である<ref>http://hoohoo.ncsa.uiuc.edu/cgi/interface.html</ref>。2004年にRFC 3875となった<ref>http://www.ietf.org/rfc/rfc3875.txt</ref>。
次のような仕様に従って動作し、ウェブサーバープログラムから呼ばれることを期待されているプログラムのことをCGIプログラムと呼ぶ。
- CGIプログラムは、ウェブサーバが、クライアントからのリクエストに応じて起動する。
- 典型的には、ウェブサーバーの公開領域に置かれたプログラムに対応するURIへのリクエストがあると、サーバーはそのプログラムをCGIの取り決めに従って呼び出す。
- CGIプログラムへの情報の入力は、コマンドライン引数、環境変数、標準入力によって行われる。
- ウェブサーバーがプログラムを呼び出す時点でいくつかの環境変数を定義することが定められている。
- 特に、クライアントがサーバーに要求したURIのうち、検索文字列(Query String)部が環境変数 QUERY_STRING に設定されるので、これはHTMLフォームからGETメソッドで入力を受けるのに便利である。
- QUERY_STRINGに文字'='が含まれない場合は、サーバーはQUERY_STRINGの内容をコマンドライン引数としてCGIプログラムに渡す。これはHTMLのISINDEX要素を用いて送信された情報を扱うのに便利である。
- クライアントからのHTTPリクエストのBODY部はCGIプログラム標準入力に流し込まれる。また、その入力の長さが環境変数CONTENT_LENGTHに設定されている。これは、HTMLフォームからPOSTメソッドで入力を受けるのに便利である。
- CGIプログラムに対応する仮想パスの後に、更に余分のパスが続いた場合、その情報は環境変数 PATH_INFO に格納され、PATH_INFO をウェブサーバーの仮想パスと解釈した際に対応すべき物理パスが環境変数 PATH_TRANSLATED に格納される。この方式もまた、CGIプログラムにユーザー側からパラメータを渡す目的でよく用いられる。
- プログラムが標準出力に出力したデータは、ウェブサーバーを経由してクライアントに送られる。このデータは正当なHTTPヘッダで始まらなければならない。
- ただし、いくつかの特別なヘッダフィールドは「サーバーディレクティブ」として解釈され、ウェブサーバーの挙動(ステータスコードなど)に影響を与える。これ以外の全てのヘッダフィールドはそのままクライアントに送信される。
- 現在のWWWではHTMLが中心的な役割を果たしているので、実際にはCGIプログラムはHTMLを出力するケースが圧倒的に多い。
- 画像データなどを出力することもある(これはアクセスカウンタなどを作る際に使われる)。
[編集] 脚注
<references/>
[編集] 関連項目
[編集] 参考文献
- The CGI Specification
- RFC3875 The Common Gateway Interface (CGI) Version 1.1
- RFC1630 Universal Resource Identifiers in WWW
- RFC2616 Hypertext Transfer Protocol -- HTTP/1.1
カテゴリ: 出典を必要とする記事 | Webサーバ

