web-dev-qa-db-ja.com

Common Gateway Interface(CGI)とは何ですか?

CGIは共通ゲートウェイインタフェースです。その名前が言うように、それはすべてのものにとって「共通の」ゲートウェイインタフェースです。それはその名前からとても些細で素朴です。私はこれを理解したと感じ、この御言葉に出会うたびに私はこれを感じました。率直に言って、私はしませんでした。私はまだ混乱しています。

私はWeb開発経験のあるPHPプログラマです。

ユーザー(クライアント)がページを要求---> webserver( - > embedded PHPインタプリタ)---->サーバーサイド(PHP)スクリプト---> MySQLサーバー。

さて、私のPHPスクリプトがMySQLサーバー、MATLABサーバー、その他のサーバーから結果を取得できるとしましょう。

だから、今PHPスクリプトはCGIですか? Webサーバーと他のすべてのサーバーの間のインターフェースなので?知りません。時々彼らはCGI、技術と他の時にCGIをプログラムあるいは他のサーバーと呼ぶ。

  • CGIって何ですか?

  • /cgi-bin/*.cgiはどうでしたか?これはどうしたの?サーバー上のこのcgi-binディレクトリが何なのかわかりません。なぜそれらが* .cgi拡張子を持っているのかわかりません。

  • なぜPerlは邪魔になるのですか。 CGI&Perl(言語)私はまた、これら2つがどうなっているのかもわかりません。私はこれら2つを「CGIとPerl」の組み合わせで聞いています。この本はもう一つのすばらしい例です PerlによるCGIプログラミング 。なぜ「PHP/JSP/ASPによるCGIプログラミング」ではないのですか?私はそのようなことを見たことがない。

  • CでのCGIプログラミング 、私をとても混乱させます。 " Cの場合 "真剣に?私は何を言うべきかわからない。混乱しているだけです。 " Cの場合 "これですべてが変わります。プログラムをコンパイルして実行する必要があります。これは私のWebプログラミングの見方を完全に変えます。いつコンパイルしますか。プログラムはどのように実行されますか(マシンコードになるため、独立したプロセスとして実行する必要があるため)。 Webサーバーとどのように通信しますか? IPC?そしてソケットプログラミングを使用して全てのサーバー(私の例ではMATLABとMySQL)とインターフェースするのですか?道に迷いました!!

  • 人々はCGIは廃止予定で、もう使われていないと言っています。そうですか?最新のアップデートは何ですか?

かつて、私はHTTP PUTリクエストにWebサーバーへのアクセスを許可しなければならなかった状況に遭遇しました(Apache HTTPD)。その長い昔。それで、私が覚えている限りでは、これは私がしたことです:

  1. Apache HTTPDの設定ファイルを編集して、すべてのHTTP PUTリクエストをいくつかのput.phpに渡すようにwebserverに指示します(私はこのPHPスクリプトを書く必要がありました)

  2. リクエストを処理するためにput.phpを実装します(ファイルを上記の場所に保存します)。

人々は私がCGIスクリプトを書いたと言った。真剣に、私は彼らが何について話していたかについての手がかりを持っていませんでした。

  • 私は本当にCGIスクリプトを書いたのですか?

私の混乱を理解してください。 (混乱している場所がわからないからです)。私はあなたにあなたの答えをできるだけ単純にしておくように頼みます。私は本当にどんな派手な技術用語も理解することができません。少なくともこの場合は違います。

編集:

私はこの素晴らしいチュートリアル "CGIプログラミングは簡単! - CGIチュートリアル を見つけました。これは simplest で可能な方法で概念を説明しています。この記事を読んだ後は、実際のコードサンプルを理解しやすくするために CのCGIプログラミング入門 を読むことをお勧めします。私はまた、このチュートリアルへのこれらのリンクをウィキペディアの記事に追加しました: http://en.wikipedia.org/wiki/Common_Gateway_Interface

716
claws

CGIは、Webサーバーにアプリケーションとの間でデータをやり取りする方法を指示するインターフェースです。より具体的には、要求情報が環境変数(要求タイプ、リモートIPアドレスなど)で渡される方法、要求本体が標準入力を介して渡される方法、および応答が標準出力を介して渡される方法について説明します。詳細は CGI specification を参照することができます。

画像を使用するには

user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.

すべてではないにしても、Webサーバーはプログラムを「CGI」として実行するように設定できます。つまり、Webサーバは、要求を受け取ると、データを特定のプログラムに転送し、環境変数を設定し、標準入力と標準出力を介してパラメータを整列化するので、プログラムはどこで何を探すべきかを知ることができます。

主な利点は、Webサーバーとプログラムの両方がCGIのしくみを知っていれば、Webから任意の実行可能コードを実行できることです。そのため、通常のCGI対応Webサーバーを使用してCまたはBashでWebプログラムを作成できます。それと、ほとんどのプログラミング環境では、標準入力、標準出力、および環境変数を簡単に使用できます。

あなたの場合はあなたのスクリプトとウェブサーバーの間の通信手段として、PHP専用のものを使用したでしょう。これはあなたが質問で言及したように、mod_phpと呼ばれる組み込みインタプリタです。

だから、あなたの質問に答える:

CGIって何ですか?

上記を参照。

/cgi-bin/*.cgiと大したことはありませんか。これでどうした?サーバー上のこのcgi-binディレクトリが何であるかわかりません。なぜそれらが* .cgi拡張子を持っているのかわかりません。

これがcgiプログラムの伝統的な場所です。多くのウェブサーバはこのディレクトリをあらかじめCGIプログラムとして実行するように設定されています。 .cgi拡張子は、CGIを介して動作することが期待されている実行可能ファイルを示します。

なぜPerlは邪魔になるのですか。 CGI&Perl(言語)私はまた、これら2つについての知識を知りません。私はこれら2つを「CGIとPerl」の組み合わせで聞いています。この本はもう一つの素晴らしい例です。Perlを使ったCGIプログラミングなぜ「PHP/JSP/ASPを使ったCGIプログラミング」ではないでしょうか。私はそのようなことを見たことがない。

Perlは古く(CGIが既に古くなったときに存在していたPHP、JSP、およびASPよりも古いため、PerlはCGIが古くなったときから存在していた) CGI経由で。今日では、WebサーバでPerlを実行するための他の方法、主に mod_Perl があります。

CでのCGIプログラミングはこれを私を大変混乱させます。 Cで?真剣に?私は何を言うべきかわからない。プログラムはコンパイルして実行する必要があります。これは、Webプログラミングに対する私の見方を完全に変えるものになります。それはどのようにWebサーバーと通信するのですか?IPC?そしてソケットプログラミングを使用してすべてのサーバー(私の例ではMATLABとMySQL)と通信するのですか?

実行可能ファイルを1回コンパイルすると、Webサーバーはプログラムを実行し、要求内のデータをプログラムに渡して、受け取った応答を出力します。 CGIは、リクエストごとに1つのプログラムインスタンスが起動されることを指定します。これが、CGIが非効率的で、時代遅れのものになっている理由です。

彼らはCGIは廃止予定だと言っています。もう使われていません。そうですか?最新のアップデートは?

パフォーマンスが最優先ではなく、コードを実行するための単純な手段が必要な場合は、依然としてCGIが使用されます。これは前述の理由から非効率的であり、Web環境で任意のプログラムを実行するためのより近代的な手段があります。現在最も有名なのは FastCGI です。

410
Vinko Vrsalovic

CGIって何ですか?

Webサーバーがデータをプログラムから取得する手段(ファイルなどではなく)。

/cgi-bin/*.cgiと大したことはありませんか。

大きな問題ではない。それは単なる慣例です。

サーバー上のこのcgi-binディレクトリが何であるかわかりません。なぜそれらが* .cgi拡張子を持っているのかわかりません。

サーバはファイルをどう処理するかを知っている必要があります(つまり、単純に処理するための何かの代わりに実行するプログラムとして扱います)。 .html拡張子を付けると、text/htmlコンテンツタイプを使用するようになります。拡張子が.cgiの場合は、プログラムとして実行するように指示されます。

実行可能ファイルを別のディレクトリに保存すると、サーバーの設定が誤った場合に、誤ったファイルを実行したり、CGIプログラムを生データとして提供したりすることに対する保護が強化されます。

なぜPerlは邪魔になるのですか。

そうではありません。 PerlはCGIと同時に大きくて人気がありました。

私は何年もPerl CGIを使っていません。私はmod_Perlを長い間使っていましたが、最近はFastCGIでPSGI/Plackを使う傾向があります。

この本はもう一つの素晴らしい例です。Perlを使ったCGIプログラミングなぜ「PHP/JSP/ASPを使ったCGIプログラミング」ではないでしょうか。

CGIはあまり効率的ではありません。 Webサーバーからプログラムと対話するためのより良い方法は、PHPとほぼ同じ時期に登場しました。 JSPとASP は、プログラムと対話するための 異なるメソッドです。

CでのCGIプログラミングはこれを私を大変混乱させます。 Cで?真剣に?

それはプログラミング言語ですね。

いつコンパイルしますか。

  1. コードを書く
  2. コンパイル
  3. アクセスURL
  4. ウェブサーバーはプログラムを動かす

プログラムはどのように実行されますか(マシンコードになるため、独立したプロセスとして実行する必要があるため)。

独立したプロセスとして実行する必要はありません(CでApacheモジュールを書くことができます)が、CGIの全体的な概念は、外部プロセスを起動することです。

Webサーバーとどのように通信しますか? IPC?

STDIN/STDOUTと環境変数 - CGI仕様で定義されています。

そしてソケットプログラミングを使用して全てのサーバー(私の例ではMATLABとMySQL)とインターフェースするのですか?

あなたが好きでサポートされているどんな方法でも使うことができます。

彼らはCGIは減価償却されると言っています。もう使われていません。そうですか?

CGIは非効率的で、遅くて単純です。めったに使われることはありませんが、使われるときは簡単だからです。パフォーマンスがそれほど重要ではない場合は、単純さが非常に重要です。

最新のアップデートは?

1.1

63
Quentin

CGIは、Webサーバー(HTTPサーバー)と特定の要求を処理するための実行可能プログラムとの間のインターフェース仕様です。

それは、その要求の特定の特性がそのプログラムの環境にどのように伝達されるべきであるか、そしてプログラムがどのようにして応答をサーバーに返すべきか、そして元のHTTP要求に対する有効な応答を形成するためにサーバーがどのように応答を「完了」するべきかを記述する。

しばらくの間、CGIはIETFインターネットドラフトだったので、有効期限がありました。それは更新なしで期限切れになったので、CGIの「標準」はありませんでした。これは現在は情報提供のRFCですが、そのような文書は一般的な慣例であり、標準ではありません。 rfc3875.txtrfc3875.html

CGIインターフェースを実装するプログラムは、ターゲットマシンで実行可能な任意の言語で書くことができます。それらは 環境変数 そして通常 標準入力 にアクセスできなければならず、それらは 標準出力 に出力を生成します。

Cなどのコンパイル済み言語は、Perlなどのスクリプト言語と同じように一般的に使用されていました。CGI環境へのアクセスを容易にするためにライブラリを使用することがよくありました。

CGIの大きなデメリットの1つは、リクエストごとに新しいプログラムが生成されるため、リクエスト間の状態を維持することがパフォーマンスの大きな問題になる可能性があることです。状態はcookieで処理されるかURLでエンコードされる可能性がありますが、大きくなる場合は別の場所に格納され、エンコードされたURL情報またはcookieからキー入力される必要があります。その場合、各CGI呼び出しはストアの状態をどこかのストアからリロードする必要があります。

このため、そしてリクエストとセッションへの非常に単純なインターフェースのために、Webサーバーとアプリケーションの間のより良い統合環境がはるかに人気があります。最新のphp実装のようなApacheは、ターゲット言語をWebサーバーとよりよく統合し、httpリクエストを効率的に処理するために必要なリクエストおよびセッションオブジェクトへのアクセスを提供します。それらはHTTPリクエストを扱うための 'プログラム'を書くためのはるかに簡単でより豊かな方法を提供します。

あなたがCGIスクリプトを書いたかどうかはむしろ解釈に依存します。確かに1つの仕事をしましたが、スクリプトとサーバー間のインターフェースが厳密にはCGIインターフェースではないモジュールとしてphpを実行するのがはるかに一般的です。

41
CB Bailey

CGIは RFC 3875 で規定されていますが、それはオリジナルの NCSA文書の後の "公式の"体系化です 。基本的に、CGIはWebサーバからのHTTPリクエストに関するデータを処理するプログラムに渡すためのプロトコルを定義します - どんなプログラムでも、どんな言語でも。仕様が書かれた時点(1993年)では、ほとんどのWebサーバーは静的なページしか含んでいませんでした。静的コンテンツとは別にcgi-binディレクトリを持ち、それらを.cgiで終わらせる。

現時点では、ここにはPHPのような専用の「Webプログラミング言語」もなく、Cが主流のポータブルプログラミング言語でした。つまり、多くの人がCで自分のCGIスクリプトを書いています。 CGIはしばらくの間Perlと同義語になりました。それから、Javaサーブレット、PHP、そして他にもたくさんのものがあり、Perlのマーケットシェアの大部分を引き継ぎました。

18

ウィキペディアで _ cgi _ をご覧ください。 CGIは、Webサーバと外部プログラムまたは入力を処理してブラウザに送信される出力を生成するスクリプトとの間の protocol です。

CGIは、Webサーバーとプログラムが通信するための単なる手段です。ここでは、サーバーがネットワーク接続とHTTPプロトコルを管理し、プログラムが入力を処理してブラウザーに送信される出力を生成します。 CGIスクリプトは基本的にWebサーバーによって実行されCGIプロトコルに従うことができるプログラムならどれでも可能です。したがって、CGIプログラムは、たとえばCで実装できます。ただし、Cはタスクにあまり適していないため、これは非常にまれです。

/cgi-bin/*.cgiは、人々が彼らのCGIスクリプトを一般に置く単なるパスです。 Webサーバは通常、デフォルトでそのパスからCGIスクリプトを取得するように設定されています。

cGIスクリプトはPHPでも実装できますが、PHPプログラムはすべてCGIスクリプトではありません。ウェブサーバがPHPインタプリタ(例えば、Apacheのmod_php)を埋め込んでいる場合、CGI段階はウェブサーバとインタプリタの間のより効率的な直接プロトコルによってスキップされます。

CGIスクリプトを実装したかどうかは、Webサーバーによるスクリプトの実行方法によって異なります。

13
Juha Syrjälä

CGIは本質的にリクエストをWebサーバで設定されている any /インタプリタに渡します - これはPerl、Python、PHP、Ruby、Cのほとんど何でも可能です。 Perlは当時最も一般的なものでした。CGIに関してよく見られるのはそのためです。

CGIは死んでいません。実際、ほとんどの大規模ホスティング会社はmod_phpとは対照的にCGIとしてPHPを実行しています。なぜならそれはユーザーレベルの設定や他のものをmod_phpより遅い間提供するからです。 RubyとPythonも通常CGIとして動作します。ここでの主な違いは、サーバーモジュールは実際のサーバーソフトウェアの一部として実行されるということです。CGIと同様に、サーバーの外側ではサーバーは完全に外側にあり、外部インタープリタへのデータの受け渡し方法を決定します。

12
prodigitalson

CGIは、リクエストを処理するためにWebサーバーから外部プログラムが呼び出されるメカニズムです。環境変数と標準入力を使用して、リクエストデータをプログラムに送ります。外部プログラムが書かれている正確な言語は重要ではありませんが、CGIプログラムを他の言語よりもある言語で書く方が簡単です。

CGIスクリプトには実行権限が必要なので、デフォルトではhttpdはcgi-binディレクトリにあるCGIプログラムを(おそらく今では見当違いの)セキュリティ目的でのみ実行することを許可します。

ほとんどのPHPスクリプトは、mod_phpを介してWebサーバープロセスで実行されます。これはCGIではありません。

プログラム(および関連するインタプリタ)はリクエストごとに起動しなければならないので、CGIは遅いです。最近の代替手段は、mod_phpによって使用される組み込み実行、およびFastCGIによって使用される長期実行プロセスです。与えられた言語はそれらのメカニズムを実装する独自の方法を持っているかもしれないので、CGIに頼る前に周りに尋ねるようにしてください。

実際の例:Webサイトに表示する必要がある複雑なデータベース。データベースは1986年頃に設計されたので(!)、ディスク領域を節約するために多くのデータがさまざまな方法でパックされていました。

開発が進むにつれて、開発者はSQLだけでは複雑なデータ要求を解決できなくなりました。たとえば、ソートアルゴリズムが異常だったためです。

賢明な解決策は3つあります。

  1. 早くて汚い:未格納のデータをPHPに送って、そこでソートする。これはページが呼び出されるたびに繰り返されるので、明らかに非常に高価な解決策です。
  2. データベースエンジンにプラグインを書く - しかし管理者は彼らのサーバーで外部コードを実行することを許可する準備ができていなかった、または
  3. データをプログラム(C、Perlなど)で処理してHTMLを出力することができます。プログラム自体は/ cgi-binに入り、PHP経由ではなく直接Webサーバー(例えばApache)から呼び出されます。

CGIはソリューション#3であなたのスクリプトを実行してブラウザにその効果を出力します。コンパイルされたプログラムの速度、SQLより優れた言語の柔軟性、そしてSQLサーバーにプラグインを書く必要はありません。 (繰り返しますが、これはSQLとCに特有の例です)

7
Michał Leon

あなたはおそらくCGIではないものを知りたいと思うでしょう、そして答えはあなたのWebサーバのためのモジュールです(私があなたがApacheを走らせていると仮定するなら)。 CGIには外部プログラム、スレッド、Perl、PHP、Cアプリケーションサーバーをインスタンス化するためのスレッドなど、MODULEとして実行すると、そのプログラムはWebサーバー(Apache)自体が必要になるためです。

これらすべてのために、パフォーマンス、セキュリティ、移植性の問題が多く発生しています。しかし、それが何であるかを理解するために、最初にCGIではないものを知っておくのは良いことです。

7
denica

CGIスクリプトはコンソール/シェルプログラムです。 Windowsでは、「コマンドプロンプト」ウィンドウを使用するときにコンソールプログラムを実行します。 WebサーバーはCGIスクリプトを実行すると、環境変数または「標準入力」を使用してコンソール/シェルプログラムに入力を提供します。標準入力は、コンソール/シェルプログラムにデータを入力するのと同じです。 CGIスクリプトの場合は、Webサーバーが入力を行います。 CGIスクリプトはデータを「標準出力」に書き出し、その出力はHTMLページとしてクライアント(Webブラウザ)に送信されます。標準出力は、Webサーバーがそれを読み込んで送信することを除けば、console/shellプログラムに表示される出力と似ています。

CGIスクリプトはブラウザから実行できます。 URIは通常、CGIスクリプトに提供されるクエリ文字列を含みます。メソッドが "get"の場合、クエリ文字列はQUERY_STRINGという環境変数でCGIスクリプトに提供されます。メソッドが "post"の場合、クエリ文字列は標準入力を使用してCGIスクリプトに提供されます(CGIスクリプトは標準入力からクエリ文字列を読み取ります)。

CGIスクリプトの初期の用途はフォームの処理でした。 HTMLの初めには、HTMLフォームには通常、「action」属性と「submit」ボタンとして指定されたボタンがありました。送信ボタンが押されると、「action」属性で指定されたURIが、クエリ文字列として送信されたフォームからのデータとともにサーバーに送信されます。 「アクション」がCGIスクリプトを指定している場合は、CGIスクリプトが実行されてからHTMLページが生成されます。

RFC 3875「The Common Gateway Interface(CGI)」では、「環境変数はCライブラリルーチンgetenv()または変数environによってアクセスされる」というように、Cを使用してCGIを部分的に定義しています。

C/C++を使用してCGIスクリプトを開発していて、それを行うためにMicrosoft Visual Studioを使用している場合は、コンソールプログラムを開発します。

6
user34660

CGIは、あなたが書いてWebサーバーサイトに保存するプログラム(またはWeb API)です。 CGIはファイルです。

このファイルはWebサーバー上に待機します。クライアントブラウザがWebサーバーにCGIファイルの実行要求を送信すると、WebサーバーはサーバーサイトでCGIファイルを実行します。もしあれば、このCGIプログラムへの入力はクライアントブラウザからのものです。このCGIプログラムの出力はブラウザに送信されます。

あなたがCGIプログラムを書くのに使う言語は何ですか?他の記事ではすでにc、Java、php、Perlなどについて言及しています。

6
Loc Pham

CGIの背後にある考え方は、プログラム/スクリプト(PerlでもCでも)がSTDIN(要求データ)を介して入力を受け取り、STDOUT(echo、printfステートメント)を介してデータを出力することです。ほとんどのphpスクリプトが適格でない理由は、それらがPHP Apacheモジュールの下で実行されるからです。

4
Nathan Osman