/ / CGIを使わないのはなぜですか? - ruby​​、cgi、fastcgi

CGIの使用を避けるのはなぜですか? - ruby​​、cgi、fastcgi

私はCGIとERBを使って自分のウェブサイトを作ろうとしていましたが、私がウェブで検索すると、 CGI、常に使用する Rack.

私はCGIがRubyプロセスの多くをフォークすることを理解していますが、 FastCGI永続的なプロセスは1つだけ作成され、PHP Webサイトでも採用されています。プラス FastCGI インターフェイスは一度に7つのオブジェクトを作成するRackとは異なり、1つの要求に対して1つのオブジェクトしか作成せず、非常に優れたパフォーマンスを備えています。

CGIを使用すべきではない具体的な理由はありますか?それとも、CGI / FastCGIを使うのは大丈夫ですか?

回答:

回答№1は1

CGIは、私がインターフェースとそれを取り巻く共通のプログラミングライブラリとプラクティスは、別の時間に書かれていました。これは、環境変数と標準入出力ストリームを介してWebサーバーに接続された別個のプロセスとしての要求ハンドラのビューを持っています。

これは今日、私たちが今日考えているように、実際には「Webフレームワーク」と「組み込みサーバーモジュール」が存在しない最先端のものでした。したがって...

再び、CGIモデルは接続ごとに1つの新しいプロセスを生成します。産卵プロセス中 それ自体 最近は安価です。重いウェブアプリケーションの初期化 - モジュールのスコアの読み取りと解析、データベース接続の作成など - これは非常に高価になります。

CGIは低すぎる(IMHO)設計に向いている

再び、CGIモデルは明示的に言及する要求とハンドラの間のインタフェースとしての環境変数と標準入力。しかし...誰が気に? CGIに基づいてライブラリやコードを見ると、フォームの解析やHTML生成に加えて、 "ビジネスロジック"が盛り込まれていることがわかります。これは、アプリケーションデザイナーよりもはるかに低いレベルです。懸念の危険な混合として広く見られている。

Rackのようなものとは対照的に::Builderは、すぐにコーダーがネームスペースをアクションにマッピングすることを考えています。その意味は、より幅広いWebアプリケーションのための意味です。 (ユーザーが入力した内容に基づいてラジオボタンを生成することを考えていないため、セマンティックWebとRESTの利点については、突然、自由に議論することができます。

はい、Rack :: BuilderのようなものはCGIの上に実装できますが、それがポイントです。抽象化の層でなければなりません CGIの上に.

CGIは卑猥に却下される傾向があります

CGIは、CGIはシンプルで広く理解されているにもかかわらず、しばしば却下されます。あなたも、CGIがあなたが知っているすべてのものであれば、手放されるかもしれません。


回答№2の場合は1

CGIを使用しないでください。それは価値がありません。 1990年代には誰も良く分からなかったが、それは良いアイデアのように思えたが、スクリプトがまれであり、フォーム提出を処理し、サイト全体を運転しないなどの特殊なケースに使用された。

FastCGIは "より良いCGI"を目指していますが、特にFastCGIワーカープロセスを管理する必要があるため、多数の方法がまだ不十分です。

ラックははるかに優れたシステムであり、非常にうまく動作します。 Rackを使用する場合は、さまざまなホスティングシステムを選択することができます。 旅客 それは本当に簡単で信頼できるものです。

何とか7つの異なるRackプロセスが実行されているか、実装に誤りがあった場合を除き、Rackが「7つのオブジェクトを一度に」作成するとはどういう意味でしょうか。

私は、CGIがRackの同等のものよりも優れた単一のインスタンスを考えることはできません。


回答№3の場合は0

CGI、ラックなどが本当に何であるかについて、多くの混乱があります。私が述べるように ここに、RackはAPI、FastCGIはプロトコルです。 CGIもプロトコルですが、狭い意味では実装であり、あなたが話すことはFastCGIとまったく同じではないので、背景から始めましょう。

90年代初頭には、Webサーバーは単純にファイル(HTML、画像、その他)をディスクから取り出してクライアントに送信します。人々は要求の時点で何らかの処理をしたいと考え始め、早い解決策は単にファイルを読むのではなく、結果をクライアントに送り返すプログラムを実行することでした。このための「プロトコル」は、ウェブサーバがプログラムとして実行するように構成されたURL(例えば、 /cgi-bin/my-script)、ここでWebサーバーはセットを設定します要求に関するさまざまな情報を含む環境変数を取得し、標準入力上の要求の本体でプログラムを実行します。これは、共通ゲートウェイインターフェイス"

このことが、それは明らかに非効率的であり、大量のWebサイトでこのような動的リクエスト処理のスタイルを使用することはほとんどありません。 (新しいプロセス全体を開始するには、計算リソースが比較的高価です。)

これをより効率的にするための1つの解決策は、新しいプロセスを開始するのではなく、リクエスト情報を既存のプロセスに送信します。これはFastCGIのすべてであり、CGIと非常によく似たインターフェースを維持します(ほとんどのリクエスト情報、そしてリクエスト本体のデータストリーム)。しかし、実際のUnix環境変数を設定して、ボディを使って新しいプロセスを開始するのではなく stdinそれは、HTTP要求と同様の要求を、既にマシン上で実行されているFCGIサーバーに送信します。ここで、これらの変数の値と要求本体の内容が指定されます。

Webサーバーがプログラムコードを何らかの形で埋め込むことができれば、コード自体を実行するだけなので、これはさらに効率的になります。これを行う方法の2つの古典的な例は次のとおりです。

  • PHPをApacheに組み込み、 "Apacheサーバーコード"が同じプロセスの一部である "PHPサーバーコード"を呼び出すようにします。

  • Apacheはまったく実行しませんが、WebサーバーをRuby(またはPythonなど)で記述し、要求を処理するためにカスタム記述されたRubyコードを読み込んで実行します。

ラックはどこに来るの?ラックは API Webリクエストを処理するコードでは、Webサーバーに関係なく、一般的な方法でそれを受け取ります。そこで、Rack APIを使用するリクエストを処理するRubyコードがいくつかあることから、Webサーバーは次のようなことがあります。

  • 独自のプロセスで機能呼び出しを単にロードするRack準拠コードにするRuby Webサーバーであること。
  • Webサーバー(任意の言語で書かれたもの)でFastCGIプロトコルを使用して、要求を処理するRack準拠コードへの関数呼び出しを行うFastCGIサーバーコードを使用して、別のプロセスと通信します。または
  • CGI環境変数とそれに渡される標準入力を解釈し、Rack準拠のコードを呼び出すまったく新しいプロセスを開始するサーバーになります。

だからあなたがCGI、FastCGI、別のものプロセス間プロトコル、またはプロセス内プロトコルは、違いはありません。サーバがそれを知っているか、CGI、FastCGIなどを理解できるプロセスと話している間は、Rackを使用してRackを使用することができます。

そう:

パフォーマンスのスケーリングのために、あなたは確かにCGIを使用したくない、FastCGI、Tomcatのような同様のプロトコル(コードの直接インプロセスコール)を使いたいと思っています。

Rack APIを使用する場合、心配する必要はありません初期段階では、RackのようなAPIの全ポイントが後で変更できるという理由で、Webサーバーとプログラムの間で使用するようにプロトコルを設定しています。