Common Gateway Interface
Common Gateway Interface(コモン・ゲートウェイ・インタフェース、CGI)は、ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。 [1][2][3]
ウェブサーバプログラムの機能の主体は、あらかじめ用意された情報を利用者(クライアント)の要求に応じて送り返すことである。そのためサーバプログラム単体では情報をその場で動的に生成してクライアントに送信するような仕組みを作ることはできなかった。 そこでサーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する方法が考案された。それを実現するためのサーバプログラムと外部プログラムとの連携法の取り決めが CGI である。
CGI は環境変数や標準入出力の扱えるプログラミング言語であれば、どの言語を用いても作成することができるが、主にPHP、Perl、Javaで作成されることが多い。
代表的なアプリケーションには、電子掲示板、アクセスカウンタ、ウィキやブログシステムなどがある。
仕様
[編集]CGI の仕様はNCSAにより最初に定義・実装(NCSA HTTPdにおいて)され、現在の最新版はCGI1.1である。2004年にRFC 3875となった。
CGI は、典型的には以下のような動作を期待される。CGIを経由して実行されるプログラムのことを、CGIプログラムと呼ぶ。
- CGIプログラムはウェブサーバがクライアントからのリクエストに応じて起動する。
- 典型的には、ウェブサーバの公開領域に置かれたプログラムに対応するURIへのリクエストがあると、サーバはそのCGIプログラムをCGIの取り決めに従って呼び出す。
- CGIプログラムへの情報の入力は、コマンドライン引数、環境変数、標準入力によって行われる。
- ウェブサーバがCGIプログラムを呼び出す時点でいくつかの環境変数を定義することが定められている。
- 特に、クライアントがサーバに要求したURIのうち、検索文字列(Query String)部が環境変数
QUERY_STRING
に設定されるので、これはHTMLフォームからGETメソッドで入力を受けるのに便利である。 QUERY_STRING
に文字「=
」が含まれない場合は、サーバはQUERY_STRING
の内容をコマンドライン引数としてCGIプログラムに渡す。- クライアントからのHTTPリクエストのボディ部はCGIプログラム標準入力に流し込まれる。また、その入力の長さが環境変数
CONTENT_LENGTH
に設定されている。これはHTMLフォームからPOST
メソッドで入力を受けるのに便利である。 - CGIプログラムに対応する仮想パスの後に、更に余分のパスが続いた場合、その情報は環境変数
PATH_INFO
に格納されPATH_INFO
をウェブサーバの仮想パスと解釈した際に対応すべき物理パスが環境変数PATH_TRANSLATED
に格納される。この方式もまたCGIプログラムにユーザー側からパラメータを渡す目的でよく用いられる。
- プログラムが標準出力に出力したデータは、ウェブサーバを経由してクライアントに送られる。このデータは正当なHTTPヘッダで始まらなければならない。
- ただし、いくつかの特別なヘッダフィールドは「サーバディレクティブ」として解釈され、ウェブサーバの挙動(ステータスコードなど)に影響を与える。これ以外の全てのヘッダフィールドはそのままクライアントに送信される。
現在のウェブではHTMLが中心的な役割を果たしているので、CGIプログラムはHTMLを出力するケースが圧倒的に多い。
- 画像データなどを出力することもある(これはアクセスカウンタなどを作る際に使われる)。
CGI以外の手法
[編集]近年では、ウェブサーバから外部のプログラムを呼び出すという負荷の大きい動作を避け、ウェブサーバの一部としてインタプリタを常時起動させておくことにより性能を向上させた mod_perlや、PSGI(Perl)、mod_php、FastCGI、WSGI(Python) などのインタフェース・実装が一般的である。
このため、比較的新しいウェブサーバアプリケーションでは、CGIを直接動作させる機能を持たないものも存在する。
- Nginx: FCGI Wrapにより、FastCGIとして動作させる。
- H2O: fastcgi-cgiにより、FastCGIとして動作させる。
- OpenBSD httpd: slowcgiにより、FastCGIとして動作させる。