CGIの基本 プログラム演習1

CGIとは

CGIプログラムとはウエブサーバベースのアプリケーションで、利用者がブラウザからアクセスした場合の接続先サーバ側の処理を記述したプログラムを指します。よって、記述言語は問わず PHP, perl, rubyなどで書かれてサーバ側のプログラムはCGIと呼びます。CGIとは主にスクリプト言語で書かれたサーバサイドプログラムのことをさすことが多いです。たとえば、C,C++で書かれたサーバサイドプログラムはハンドラと呼ばれることが多いです。Javaの場合は、サーブレットと呼ばれるようです。
反対に、静的にウエブページ(HTMLファイル)をサーバ側に設置して表示する場合は、その出力はウエブサーバ内部の処理で完結するためCGIとは呼ばれません

ウエブサーバとCGIの関係

ウエブサーバにはたくさんの種類(apache, IISなど)があります。ここでは多数のサイトで利用されているapacheを例にとってウエブサーバ上でCGIを動かす方法を説明します。

apacheを動作する場合、その動作方法を定義する httpd.conf にその定義を記述する。CGIプログラムの実行の仕組みは、apacheが起動しているプロセスの内部で特定の言語のCGIプログラムど動作させる「組み込みモジュール型」とするか、もしくは別の言語プログラムをapacheの動作プロセスから起動(fork)してその処理結果をapacheに渡し、クライアントに送信する「別プロセス型」の違いに大きく分かれます。「組み込みモジュール型」の場合はプログラムを起動する負荷がないので、クライアントから見たCGIの実行速度は高速になりますが、ウエブサーバ起動時にそのライブラリを事前に読み込む必要があります。また、詠み込むライブラリは事前に別途入手する必要があります

PHPは「組み込みモジュール型」で利用するとが多く apache + PHP の環境では httpd.conf内に

LoadModule php5_module        modules/libphp5.so
AddType application/x-httpd-php .php .phtml

と書かれている部分があります。この部分の定義で、PHPが動作できるようになります。

「別ブロセス型」で動作させる場合は、apacheにはCGIでプロセスを実行できるような許可を与えることになります。

ScriptAlias /cgi-bin/ "/Applications/MAMP/cgi-bin/"
AddHandler cgi-script .cgi

などと記述されている。CGIプログラムは /Applications/MAMP/cgi-bin/" に .cgi という拡張子で配置することで /cgi-bin/のパスにおいて CGIの実行を許可するという意味です。

http://localhost:8888/cgi-bin/hellow.cgi とアクセスされた場合

bash-3.2$ cat /Applications/MAMP/cgi-bin/hellow.cgi 
#!/bin/sh

echo "Content-type: text/plain;"
echo
echo "hello world"

というプログラム(この場合は /bin/sh) が起動し、プログラムの実行結果(標準出力の内容)がクライアントに応答します。(hellow.cgiに実行可能権限を与えておく必要あり)

拡張子を .pl も許可したい場合は

AddHandler cgi-script .cgi .pl

と変更する。また、cgi-bin以外のパスでも動作させたい場合は、


        ...
        Options  ... ExecCGI
        ...

というように Options に ExecCGI (または All) と記述します。

perlを「組み込みモジュール型」として動作させたい場合は mod_perl と呼ばれるモジュールを組み込むことが一般的です。

CGI環境変数

ウエブサーバから呼び出されてCGIはクライアントからさまざまな情報が環境変数として引きわたります。簡単なCGIを作成してどのような情報がクライアントから渡るのか確認しましょう。

bash-3.2$ cat index.pl 
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

print "Content-type: text/html\n\n";

print<<EOM;
<html>
<head>
<title>Sample Program 1 perl-1</title>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
</head>
<body>
<pre>
EOM

print Dumper(\%ENV);

print<<EOM;
</pre>
</body>
</html>
EOM
exit;

perlCGIを動作させる場合、出力の最初が Content-type: text/html\n\n でである必要があります

bash-3.2$ cat index.php 
<?php
print<<<EOM
<html>
<head>
<title>Sample Program 1 perl-1</title>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
</head>
<body>
<pre>
EOM;

print_r($_SERVER);

print<<<EOM
</pre>
</body>
</html>
EOM;
exit;
?>


たくさんの変数がCGIプログラムに渡されていることがわかります。URLの引数 (index.php?aaa=bbb&ccc=ddd)も含めてアクセスしてみてください。 QUERY_STRING の変数でその値が変化すると思います。これ値をもとにクライアントに動的なページを返却します。

【演習】
CGIが渡される環境変数の各項目が何を表しているか調べましょう。
参考
http://homepage2.nifty.com/BASH/WWW/header.html