SchemeスクリプトをCGIとして起動させるための条件
通常のSchemeスクリプトと異なり、SchemeスクリプトをCGIとして動作させるには次の条件を満たす必要があります。
- HTTPサーバーがCGIを利用可能であること
- Schemeスクリプトの拡張子がCGIとして起動可能な拡張子であること
- HTTPサーバーからgoshインタプリタが起動できるようになっていること
HTTPサーバーには様々な製品がありますが、ここでは最も多く使われているApacheを例にあげます。
1については、Apacheではmod_cgidをはじめとするCGI対応モジュールがApacheに組み込まれている必要があります。Apacheでmod_cgidを組み込むには、Apache設定ファイル(例えばhttpd.confといった名前でApache起動時に読み込まれる)にLoadModuleディレクティブを記述する必要があります。
例:
LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so
上記はUbuntu Linuxの場合です。/usr/lib/apache2/modules/ディレクトリにあるmod_cgid.so共有ライブラリにcgid_moduleという名前をつけて読み込んでいます。
mod_cgidの共有ライブラリのパス名である/usr/lib/apache2/modules/mod_cgid.soの部分は環境によって異なります。
2については拡張子.cgiをCGIファイルとして起動することが一般的です。Apacheで特定の拡張子をCGIとして起動させるためには、Apache設定ファイルにAddHandlerディレクティブを記述する必要があります。
例:
AddHandler cgi-script .cgi
3についてはまずGauche処理系がHTTPサーバーにインストールされている必要があります。次に、「Schemeスクリプトを書く」で説明した通り、Schemeスクリプトの1行目に次の記述を行うことでgoshインタプリタをApacheから起動することができます。
#!goshインタプリタのフルパス名
例:
#!/usr/local/bin/gosh
最も簡単なCGIスクリプト
CGIスクリプトはheader(ヘッダ)部とbody(本体)部に分かれています。
ここでは最も簡単なCGIスクリプトとして、Content-Typeヘッダとbody部を持った次のCGIスクリプトを書いてみましょう。
#!/usr/local/bin/gosh
(print "Content-Type: text/plain;\n\nHello, Gauche!\n")
このスクリプトにhello.cgiといった名前を付け、CGIとして実行可能なパスに保存します。「Schemeスクリプトを書く」で説明した通り、実行パーミッションを付与することを忘れないでください。
例:
sudo chmod 0755 hello.cgi
このスクリプトをブラウザから実行すると次の内容がSchemeスクリプトからHTTPサーバーに印字されます。
Content-Type: text/plain;
Hello, Gauche!
1行目がHTTPヘッダです。ここではContent-Typeヘッダをtext/plain;に設定しています。
ヘッダの次にある空行はヘッダ部と本体部の区切りです。本体部ではHello, Gauche!を印字し改行しています。
ブラウザからこのCGIのURLをアクセスすると本体部の内容のみが表示されます。
Hello, Gauche!
CGIのURLは環境によって異なります。ローカル開発環境でHTTPサーバーを動かし、同じhostでブラウザを動作させるなら例えば次のURLになるかも知れません。
http://localhost/cgi-bin/hello.cgi
通常のSchemeスクリプトとCGIの違い
SchemeスクリプトをCGIとして動作させるとき、起動方法そのものはシェルから起動するかHTTPサーバーから起動するかの違いだけですが、大きく異なるのはスクリプトに対する入出力です。
通常のSchemeスクリプトはコマンドライン引数や標準入出力を使って入出力が行えますが、CGIの場合、出力は標準出力に行いますが、入力はHTTPのGETメソッドやPOSTメソッドを経由して行います。
CGIがGETメソッドやPOSTメソッドを経由して入力を受け取る方法は次節以降で説明します。