SCGI( Simple Common Gateway Interface )は、 CGIプロトコルの代替として、アプリケーションがHTTPサーバーと連携するためのプロトコルです。FastCGIに似ていますが、解析が容易になるように設計されています。CGIとは異なり、長時間実行されるサービスプロセスがリクエストの処理を継続できるため、セットアップのオーバーヘッド(データベースへの接続など)によるリクエストへの応答遅延を回避できます。
SCGIは、 Webサーバーとアプリケーションサーバー間の通信を定義するプロトコルです。これは、CGIとは対照的です。CGIは、アプリケーションプログラマがソケットや長時間実行されるサービスプロセスの複雑さを回避できるように設計された、より古いアプリケーション(ゲートウェイ)インターフェースであり、スケーラビリティの低さや高いオーバーヘッドが許容される場合に使用されます。
SCGIプロトコルは、Webサーバーが既にHTTPリクエストを解析および検証済みであるという事実を利用し、アプリケーションプログラマが解析の曖昧さやプロトコルのエッジケースを回避できるようにしながら、リクエストをSCGIサーバーに正規に伝達します。これにより、RFC 2616の複雑なヘッダー解析およびヘッダー結合ルールが不要になり、SCGIサーバー処理の複雑さを大幅に軽減できます。
ニール・シェメナウアーは、2001年10月にオリジナルのSCGIプロトコル仕様を公開しました。[ 1 ]彼はSCGIの最初の実装を開発し、2002年4月に最初に公開しました。[ 2 ]
クライアントは、8ビットバイトの送信を可能にする信頼性の高いストリームプロトコルを介してSCGIサーバーに接続します。クライアントはまずリクエストを送信します。SCGIサーバーはリクエストの終了を確認すると、レスポンスを返信して接続を閉じます。レスポンスのフォーマットはこのプロトコルで特に規定されていませんが、一般的にはCGIと同等のHTTPレスポンスが使用されます。[注1]
SCGIリクエストは、netstringエンコードされたヘッダーとボディを連結したものです。SCGIレスポンスは通常のHTTPレスポンスです。
各ヘッダーは名前と値のペアで構成され、名前と値はどちらもヌル終端文字列(C言語の文字列)です。値は空文字列でも構いませんが、その場合も終端ヌルは残ります。名前と値のどちらにも、ヌルバイトを埋め込むことはできません。これらの考慮事項はC言語の文字列では標準的ですが、他の文字列処理規格に慣れているプログラマにとっては混乱を招くことがよくあります。
提供されたすべてのヘッダーは連結されて単一のバイトシーケンスとなり、その後ネットストリングエンコードされます。存在する場合は、生のボディが追加されます。
リクエスト ヘッダーでは、重複する名前は許可されていません。RFC 2616 に準拠したヘッダー結合[注 2]が既に行われている必要があります。最初のリクエスト ヘッダーは、名前が "CONTENT_LENGTH" で、値が本文の長さを 10 進数で表したものである必要があります。"CONTENT_LENGTH" リクエスト ヘッダーは、値が "0" であっても常に存在する必要があります。また、名前が "SCGI" で値が "1" のリクエスト ヘッダーも常に存在する必要があります。古い CGI プログラムを SCGI に変換する際の互換性のために、標準の CGI環境変数はSCGI ヘッダーで提供する必要があります。リクエストで提供される本文 (存在する場合) はヘッダーの後に続きます。本文の長さは "CONTENT_LENGTH" リクエスト ヘッダーで指定されます。
SCGIプロトコルはサービスプログラマをHTTPに関するいくつかの考慮事項から隔離しますが、さまざまな詳細(Transfer-Encodingヘッダーに従ってメッセージ本文のオクテットを解釈すること、CONTENT_LENGTHが送信用にエンコードされた本文のオクテット数であることなど)については、依然としてHTTPプロトコル仕様の知識が必要です。
ウェブサーバー(SCGIクライアント)は接続を開き、以下の文字列を連結したものをサービスプロセス(SCGIサーバー)に送信します。
「70:」 "CONTENT_LENGTH" <00> "27" <00> "SCGI" <00> "1" <00> 「リクエストメソッド」<00>「POST」<00> "REQUEST_URI" <00> "/deepthought" <00> 「」 「人生の答えとは何か?」
SCGIサーバーは、Webサーバーに以下の応答を返します。
「ステータス: 200 OK」 <0d 0a> "Content-Type: text/plain" <0d 0a> "" <0d 0a> 「42」
SCGIサーバーが接続を閉じます。
(このリストは完全ではありません)
SCGIは、ネットワークソケットとネットストリングをサポートするあらゆる言語で実装できます。以下は、SCGIバインディングが既知の言語の一部です。
アプリケーション/ゲートウェイプロトコル:
アプリケーションホスト(言語固有):