[メモ] CGIとFastCGIの仕様について

投稿者: | 2018年2月17日

はじめに

CGIとFastCGIの仕様を理解するために調べて、概要と入手可能な仕様へのリンクを書き留めています。

CGIとは?

静的な情報しか返せないWebサーバー(HTTPサーバー)で動的なを返すために、実行可能な外部プログラムを呼び出だして処理させるための仕様の一つです。

CGIの仕様に従って作られたプログラムはCGIプログラムと呼ばれます。CGIプログラムは実行可能なバイナリファイル以外に、シバン(shebang)を含んだ実行権限が与えられたスクリプトファイルを含みます。

CGIの仕様に従っていれば共有ライブラリや、Webサーバー内のサブルーチンもCGIプログラムに含まれます。(RFC 3875 – 1.4. Terminologyより)

CGIプログラムはCGIの仕様に従って、CGIリクエストを受け取りCGIレスポンスを返さなければなりません。

CGIの仕様はRFC 3875で「The Common Gateway Interface (CGI) Version 1.1」として提供され以下のことを決めています。

  • CGIプログラムを呼び出すWebサーバーの役割

    • トランスポートレベルの認証とセキュリティ
    • CGIプログラムの選択
    • CGIリクエストへの変換
    • CGIレスポンスからの変換
  • 呼び出すプログラムの指定方法(URI)

  • WebサーバーからのCGIリクエストの受け取り方(経路・プロトコル)

  • WebサーバーへのCGIレスポンスの返し方(経路・プロトコル)

FastCGIとは?

FastCGIは、CGI方式の高性能化を目的にCGIの拡張機能として考えられた仕様です。

CGI方式と呼ばれている実装が「リクエスト毎にプログラムを起動して、処理後にプログラムを終了させる」ためパフォーマンスが悪いと言われます。

FastCGIの仕様ではWebサーバーは、外部プログラムの起動や停止を行いません。FastCGIの仕様に従って作成されたFastCGIサーバーへ、FastCGIの独自プロトコルにより要求を送ります。FastCGIサーバーはプロセスを使い捨てずに再利用することでパフォーマンスを良くます。

実行される外部プログラムは、FastCGIの独自プロトコルを扱うためのライブラリに合わせて変更が必要ですが、多くはライブラリに隠蔽されているのでCGI 1.1を扱う処理と同じになります。

CGIのように運用できるように外部プログラムを起動するラッパーと、プロセスの維持管理を行うライブラリも提供されていますが、各プログラム言語毎に対応がまちまちなのでCGIより扱いづらいです。

初めに公開したOpenMarket社から買収〜倒産〜部署買取などでOracleに管理が移っていらしいですが、OracleではFastCGIの資料を公開するページはなく、もとの仕様を公開していたページも消滅してしまったため、現在はgithub – mcarbonneauxさんがバックアップとしてFastCGI.com Archivesで情報を公開しています。