CGI工房:TOPに戻る


First Step CGI




目 次

1.はじめに
2.CGIとは
2.1 CGIでできること
2.2 CGIとPerl
2.3 CGIを利用するためには
3.CGIを設置するまで
3.1 Perlスクリプトの準備
3.2 スクリプトのアップロード
3.3 パーミッションの変更
3.4 telnetでの確認
3.5 ブラウザで実行する
4.CGIで注意すること
4.1 動作テストは十分に(いきなりブラウザで実行しない)
4.2 任意のコマンドが実行できるようなスクリプトは書かない
4.3 サーバーに負担がかからないスクリプトを
5.CGIがうまく動作しないとき
5.1 Perlのパス指定
5.2 スクリプトの転送モード
5.3 パーミッションの設定
5.4 利用するPerlのバージョン
5.5 利用するWWWサーバープログラムの種類

1.はじめに
ホームページを公開していると、掲示板やチャットなど、通常のHTML文書ではできないようなページを公開してみたいと思ったりする事があります。このような時によく使われるのがCGI(ommon ateway nterface)です。

ちょっと凝ったページ作りにCGIを使ってみませか?

なお、最初にお断りしておきますが、このページはCGIの設置についての説明が中心となっています。Perlスクリプトの書き方については、
「CGI Programing with Perl」をご覧下さい。
戻る
2.CGIとは
CGIとは、WWWサーバー上のプログラムが実行した結果を、テキストやイメージデータとしてブラウザにかえして表示させる仕組みのことです。通常のHTML文書の場合だと、アップロードされたドキュメントをそのまま表示するだけですが、CGIを使えば、アクセスされたときの時刻や、あるいはフォームなどから入力された条データの内容に応じて異なった結果を表示するといったことが可能になります。

これらは、次のようなイメージになります。

通常の場合   CGIを使った場合
通常の場合   CGIを使った場合

このように、ブラウザからの要求に対してそのままHTMLドキュメントを返すのではなく、CGIプログラムが処理した内容をHTMLドキュメントとして返していく事になるわけです。
2.1 CGIでできること
CGIを使った主な例としては、アクセスカウンタや書き込みのできる掲示板などがあります。また、時刻に応じてメッセージを変えるなど、通常のHTMLドキュメントではできない処理を行うこともCGIを使えばできるようになります。
2.2 CGIとPerl
CGIはサーバー上のプログラムを実行できればなんでもOK(のはず)です。C言語で書いたプログラムをコンパイルして実行してもよいのですが、プロバイダによっては、Cコンパイラ(ccやgcc)などを一般のユーザーが使えないことも多いので、スクリプト型言語のPerlを用いてCGIを利用することになります。

Perlのばあい、処理を行いたい内容(スクリプト)をテキストファイルにまとめ、それをPerlが実行時に解釈しながら処理をしていきますので、ユーザー側ではスクリプトさえ用意すればよいので、比較的簡単にCGIを利用することができるわけです。
2.3 CGIを利用するためには
CGIを利用するにあたって、以下のような条件が必要です。
まず、CGIを設置したいプロバイダで、CGIが使えることが第1条件になります。CGIではサーバー上のプログラムが実行されるので、場合によってはサーバーに重大な影響をおよぼす可能性があります。このため、プロバイダによってはCGIを禁止しているところもあります。

また、CGIが使える状況だとしても、それを処理するプログラム(Perlなど)が実行できなければ、結局はCGIが利用できないことになります。これらについては、プロバイダごとに方針がありますので、よくわからない場合はプロバイダに直接問い合わせをする必要があります。

次にパーミッションの変更ですが、一般的なWWWサーバーはOSにUNIX系のものが使われることがほとんどです。このUNIXではユーザーごとにファイルにアクセスできるレベル(パーミッション)の設定を行って、実行可能な状態にする必要があります。なお、パーミッションの設定については後で説明します。

最後に、以上の作業を行うにあたって、telnetが利用できるとたいへん便利です。telnetログインすると、サーバー上のプログラムなどをコマンドラインレベルで実行できますので、スクリプトのデバッグやパーミッションの変更など色々な作業が可能になります。
戻る
3.CGIを設置するまで
ごく簡単なCGIを、WWWサーバーに設置するまでの手順について解説します。
3.1 Perlスクリプトの準備
まずPerlスクリプトを準備します。スクリプトは自分で書いたものでも、あるいは、どこかのサイトからダウンロードしたものでもかまいません。ここでは、以下のような内容のスクリプトでCGIを設置してみることにします。

なお、ファイルの拡張子は .cgi に設定して下さい。


sample.cgi
#! /usr/local/bin/perl print "Content-type: text/html\n\n"; # HTML出力のおまじない print "<HTML>\n<HEAD>\n"; # ¥nは改行コード print "<TITLE>CGI-SAMPLE</TITLE>\n\n"; print "<BODY>\n"; print "First Step CGI\n"; print "</BODY>\n</HTML>\n";
Perlスクリプトについては、
「CGI Programing with Perl」をご覧下さい。
3.2 スクリプトのアップロード
スクリプトが用意できたら、WWWサーバーにスクリプトをFTPでアップロードします。このときに注意したいことが使用するOSごとの改行コードの違いです。

一般に各OSの改行コードは以下のようになっています。
 OS    改行コード  
 UNIX    0D  
 Windows(DOS)    0D-0A  
 Mac    0A  

このため、Windows上で作ったスクリプトなどは改行コードを変換してやる必要があります。

WindowsからUNIXへのアップロードの場合が多いと思いますので、あらかじめ改行コードを変換しておくか、FTPソフトの機能を使って変換しながらアップロードすればよいことになります。一般には、テキストモード(アスキーモード)でアップロードすればよいです。
3.3 パーミッションの変更
アップロードが終わったら、そのスクリプトのパーミッションを設定してCGIとして実行できるようにします。UNIXでのパーミッションについては、詳しく説明していくといろいろあるのですが、ここでは、CGIに関係するパーミッションの変更について解説します。

まず、Perlスクリプトは 755 に設定します。また、データファイルなどは 666 に設定します。

設定は、telnetが使える人は chmod コマンドを使って次のように変更します。
    例1) chmod 755 sample.cgi
    例2) chmod 666 sample.dat

あるいは、FTPソフトの機能を使って次のように行います。
    例3)
WS_FTPで 755 に設定する例
    例4) WS_FTPで 666 に設定する例

ちなみに、数字の意味は、Read属性が4、Write属性が2、実行属性が1となっており、その合計で値を決定します。OwnerやGroup、Otherについてはよくわかっていません(汗)。
3.4 telnetでの確認
パーミッションの設定まで終わると、いよいよスクリプトを実行させるわけですが、このスクリプトがエラーを引き起こしていないか確認する必要があるでしょう。とくにWWWサーバーの場合、自分だけがそのサーバーを利用しているわけではないので、スクリプトのエラーが原因でサーバーがダウンするようなことでは困ります。

そこで、ホームページでCGIを公開する前に、(できることなら)telnetでスクリプトを実行してエラーを起こしていないか確認したいものです。telnetが解放されているなら、ログインした後スクリプトを実行して、正しくHTMLドキュメントのソースが表示されているかを確認してください。

telnetでログインしてCGIを設置しているディレクトリに移動したら
    sample.cgi
と入力してみてください。何も問題がなければ、ヘッダ文(Content-type: text/html)に続いてHTMLドキュメントが表示されるはずです。

単なる文法上の誤りなら、この段階で簡単にチェックできます。
3.5 ブラウザで実行する
telnetでスクリプトの確認ができたら、いよいよブラウザでCGIを実行します。画面の結果は次のようになるでしょう。

    
sample.cgiの実行例
戻る
4.CGIで注意すること
WWWサーバーは、自分一人が使うコンピュータではありません。みんなが使用すると言うことを念頭に置いて、思いつくままにCGIを利用する上での注意点をあげてみます。
4.1 動作テストは十分に(いきなりブラウザで実行しない)
当たり前のことなのですが、スクリプトの動作チェックは十分に行ってから公開して下さい。特にファイルを扱うスクリプトなどの場合、十分デバッグをおこなってから公開しないと、WWWサーバーに重大なダメージを与えてしまう事があります。
4.2 任意のコマンドが実行できるようなスクリプトは書かない
CGIはサーバー上で実行されますので、書き込みの出来る掲示板などの場合、たとえ悪意がなくても、サーバー上のプログラムを実行してしまう可能性がないとも言えません。そのようなことになってしまったとき、あなたは責任がとれますか? 稼働実績があるスクリプトならともかく、自分でスクリプトを作成する場合は、そのあたりを十分に配慮してCGIを設置して下さい。
4.3 サーバーに負担がかからないスクリプトを
CGIは通常のWWWサーバーとしての仕事以外の処理を行うため、確実に通常よりもWWWサーバーへの負担が重くなります。無限ループに陥ってしまうスクリプトなどを書いてしまうと、みんながアクセスするサーバーに多大な負担をかけることになります。

このようなことにならないためにも、以下の事に注意してプログラミングをすすめて下さい。
戻る
5.CGIがうまく動作しないとき
設置したCGIがうまく動作しない場合ときなどは、以下の点をもう一度確認してみて下さい。
5.1 Perlのパス指定
一般的なUNIXサーバーでは、Perlのパス指定は /usr/local/bin/perl になりますが、サーバーによってはこれが違う場合があります。telnetが使用出来る場合は、自分でPerlの位置を確認することが出来ますが、そうでない場合はプロバイダに問い合わせて確認する必要があります。

ちなみに、telnetでの確認方法は以下のようになります。
    which perl
5.2 スクリプトの転送モード
CGIスクリプトは、必ずテキストモードでFTPしてください。そうでない場合、OSによって改行コードに違いがあるためスクリプトが正しく解釈されません。
5.3 パーミッションの設定
アップロードしたファイルは、スクリプトの場合で 777 に、書き込みを行うデータファイルで 666 にパーミッションを設定しなければなりません。
5.4 利用するPerlのバージョン
CGI工房で公開しているCGIスクリプトは、Perlのバージョンが5のもので動作チェックを行っております。使用するPerlのバージョンによってはうまく動作しない場合があります。
5.5 利用するWWWサーバープログラムの種類
WWWサーバーには色々なプログラムが使用されています。代表的なものに NCSA HTTPD や APATCH などがありますが、このほかにも CERN HTTPDやWindowsNTで運用されているIISなどがあり、それぞれに違いがあるので注意が必要です。

主なところでは、CERN系のサーバーではファイルのアクセス時にフルパスで指定しないと読み書きできないことなどがあります。
戻る
CGI工房 (98/06/01)