【Web学習ノート】CGI概念と使い方を簡単に分析する
5321 ワード
1.CGIとは何ですか CGIはCommon Gateway Interfaceの簡略化であり、WebServerバックエンドに位置するウェブアプリケーションがclientの要求に従ってウェブコンテンツを動的に生成できるようにする標準的な方法を提供している。インターネットアプリケーションで一般的なC-Sモードでは、Serverの観点から、CGIはWebServerと具体的なコンテンツを生成するWebプログラムとの間のインターフェースを提供し、CGI標準プロトコルを具体的に実現するプログラムをCGIスクリプト(通常はスクリプト言語で実現されるため)またはCGIと呼ぶ。 厳密な意味ではCGIは標準的(詳細はCGI-RFC-Doc参照)ですが、私たちがよく耳にするCGIとは、CGI規格を実現するCGIプログラムのことです。 新米にとって、CGIのこの二重の概念をはっきりさせる必要があります。そうでないと、概念がはっきりしないために霧がかかります。 初心者のCGIに対する戸惑いについて、Stock Overflowには面白い且つ経典的な書き込みがあり、周囲を強く提案します。C/C++でも可能です。 I never really undestood:what is 、CGIの二重概念を理解するのに役立つと信じています。
2.CGIを導入する目的 CGI規格は、一連のメタ-variablesと呼ばれる抽象的なパラメータを定義しており、これらのmeta-variablesは、クライアントからのhttp要求を記述して、WebServerとバックエンドCGIプログラムのインターフェースを実現しています。このインターフェースはプラットフォームとは無関係です。 CGIの存在により、WebServerとバックエンドプログラムはそれぞれの職務を担当することができます。 1)WebServerは、HTTP接続、データ転送、ネットワークイベントなどのクライアント要求に関する処理を担当していますが、具体的なアプリケーションとは関係ないロジックです。 2)バックエンドプログラム処理アプリケーション関連ロジックは、要求パラメータに基づいてデータを動的に生成し、WebServerでクライアントに返信する。 典型的なC−S相互作用の完全な流れは以下の通りである。 WebServerは、clientからの要求を受信し、その要求パラメータをCGIに変換したmeta-variablesとmessage-body(HTTP POSTのbodyデータなど)を受信し、次に、URIパラメータに基づいて適切なCGIプログラムを選択し、ユーザ要求を処理し、CGIプログラムから戻った結果データを受信し、最後に、clientにデータを返す。 説明が必要なのは、client requestを処理する過程で、WebServerは、プロトコルレベルまたはトランスポート層のセキュリティ認証(https認証など)の実現に責任を負う。
3.実例説明 clientのhttp GETでお願いします。http://somehost.com/cgi-bin/somescript/this%2eis%2epath%3binfo?param1=hello¶m2=world例として、次のような形式で抽象化することができる。「/」「:」「?」 CGI規格によれば、WebServer下流に位置するCGIプログラムは、このhttp要求をCGI規格で定義された一連のmeta-variablesに変換します。 :値は「http」で、meta-variablesの中のSERVER_に対応しています。PROTOCOL :値は「somehost.com」で、SERVER_に対応しています。NAME :デフォルト値80は、SERVER_に対応しています。PORT :値は「/cgi-bin/somescript/」で、SCRIPT_に対応します。NAME :値は「this%2 eis%2 epath%3 binfo」です。実際には、別のmeta変数PATH_です。INFOのurl-encoded形式 :値はparam 1=hello¶m 2=worldで、QUERY_に対応します。STRING CGIプログラムはhttp要求を標準のCGI meta varialbesに変換しましたので、バックエンドサービスモジュールがどんな言語で実現されているかに関わらず、具体的なhttp要求に関心を持たなくても、どのように解析する必要がありますか?これらのmeta変数にアクセスして対応処理すればいいです。これはまさにCGI基準とCGIプログラムの意味です。
4.CGIについての補足説明 従来のCGIスクリプトは実行可能なプログラムで、実行するたびに新しいプロセスを作成します。このように一つの問題を引き起こします。webserverは毎回CGIプロセスを作成して実行してから結果を返します。Linuxシステムでは、作成プロセスの価格は比較的高く、特に生産環境が高合併かつ低遅延を要求する場合、新築プロセスはシステム性能に対する影響がより顕著になる。 この現実的な駆動の下で、2つのよくある最適化の考え方が現れました。 1)あらかじめ一連のCGIプロセスを作成して、毎回の新規プロセスを避ける。代表例:CGI 2)業務コードは直接拡張モジュールとしてWebServerに埋め込まれて実行される。代表例:ApacheまたはNgixのmod_php拡張など
5.CGIの実際展開例 lighttpdを例にとって、lighttpd.com nfで2つの構成をすればいいです。 1)webserverでロードしたい拡張モジュールの中で「moduploxyback dcgi」を指定しています。例は以下の通りです。
=====================================================================================================
2.CGIを導入する目的 CGI規格は、一連のメタ-variablesと呼ばれる抽象的なパラメータを定義しており、これらのmeta-variablesは、クライアントからのhttp要求を記述して、WebServerとバックエンドCGIプログラムのインターフェースを実現しています。このインターフェースはプラットフォームとは無関係です。 CGIの存在により、WebServerとバックエンドプログラムはそれぞれの職務を担当することができます。 1)WebServerは、HTTP接続、データ転送、ネットワークイベントなどのクライアント要求に関する処理を担当していますが、具体的なアプリケーションとは関係ないロジックです。 2)バックエンドプログラム処理アプリケーション関連ロジックは、要求パラメータに基づいてデータを動的に生成し、WebServerでクライアントに返信する。 典型的なC−S相互作用の完全な流れは以下の通りである。 WebServerは、clientからの要求を受信し、その要求パラメータをCGIに変換したmeta-variablesとmessage-body(HTTP POSTのbodyデータなど)を受信し、次に、URIパラメータに基づいて適切なCGIプログラムを選択し、ユーザ要求を処理し、CGIプログラムから戻った結果データを受信し、最後に、clientにデータを返す。 説明が必要なのは、client requestを処理する過程で、WebServerは、プロトコルレベルまたはトランスポート層のセキュリティ認証(https認証など)の実現に責任を負う。
3.実例説明 clientのhttp GETでお願いします。http://somehost.com/cgi-bin/somescript/this%2eis%2epath%3binfo?param1=hello¶m2=world例として、次のような形式で抽象化することができる。
4.CGIについての補足説明 従来のCGIスクリプトは実行可能なプログラムで、実行するたびに新しいプロセスを作成します。このように一つの問題を引き起こします。webserverは毎回CGIプロセスを作成して実行してから結果を返します。Linuxシステムでは、作成プロセスの価格は比較的高く、特に生産環境が高合併かつ低遅延を要求する場合、新築プロセスはシステム性能に対する影響がより顕著になる。 この現実的な駆動の下で、2つのよくある最適化の考え方が現れました。 1)あらかじめ一連のCGIプロセスを作成して、毎回の新規プロセスを避ける。代表例:CGI 2)業務コードは直接拡張モジュールとしてWebServerに埋め込まれて実行される。代表例:ApacheまたはNgixのmod_php拡張など
5.CGIの実際展開例 lighttpdを例にとって、lighttpd.com nfで2つの構成をすればいいです。 1)webserverでロードしたい拡張モジュールの中で「moduploxyback dcgi」を指定しています。例は以下の通りです。
## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules = (
"mod_access",
"mod_expire",
"mod_accesslog",
"mod_error_redirect",
"mod_cookie",
"mod_firewall",
"mod_deflate",
"mod_rewrite",
"mod_proxy_core",
"mod_proxy_backend_fastcgi",
"mod_redirect"
)
2)webserverバックエンドモジュールへの転送プロトコルをCGIプロトコルとして指定しました。例は以下の通りです。$HTTP["url"] =~ "\.php" {
proxy-core.balancer = "static"
proxy-core.allow-x-sendfile = "enable"
proxy-core.protocol = "fastcgi"
}
【参考資料】1.FastCGI 2.wikipedia-Common Gateway Interface 3.RFC 3875-The Common Gateway Interface(CGI)Version 1.1 4.CGI Program ming Is Simple! 5.StockOverflow-I never really undestood:what is CGI? =====================================================================================================