- 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サーバープログラムの種類
ホームページを公開していると、掲示板やチャットなど、通常のHTML文書ではできないようなページを公開してみたいと思ったりする事があります。このような時によく使われるのがCGI(Common Gateway Interface)です。戻る
ちょっと凝ったページ作りにCGIを使ってみませか?
なお、最初にお断りしておきますが、このページはCGIの設置についての説明が中心となっています。Perlスクリプトの書き方については、「CGI Programing with Perl」をご覧下さい。
CGIとは、WWWサーバー上のプログラムが実行した結果を、テキストやイメージデータとしてブラウザにかえして表示させる仕組みのことです。通常のHTML文書の場合だと、アップロードされたドキュメントをそのまま表示するだけですが、CGIを使えば、アクセスされたときの時刻や、あるいはフォームなどから入力された条データの内容に応じて異なった結果を表示するといったことが可能になります。2.1 CGIでできること
これらは、次のようなイメージになります。
通常の場合 CGIを使った場合
このように、ブラウザからの要求に対してそのままHTMLドキュメントを返すのではなく、CGIプログラムが処理した内容をHTMLドキュメントとして返していく事になるわけです。
CGIを使った主な例としては、アクセスカウンタや書き込みのできる掲示板などがあります。また、時刻に応じてメッセージを変えるなど、通常のHTMLドキュメントではできない処理を行うこともCGIを使えばできるようになります。2.2 CGIとPerl
CGIはサーバー上のプログラムを実行できればなんでもOK(のはず)です。C言語で書いたプログラムをコンパイルして実行してもよいのですが、プロバイダによっては、Cコンパイラ(ccやgcc)などを一般のユーザーが使えないことも多いので、スクリプト型言語のPerlを用いてCGIを利用することになります。2.3 CGIを利用するためには
Perlのばあい、処理を行いたい内容(スクリプト)をテキストファイルにまとめ、それをPerlが実行時に解釈しながら処理をしていきますので、ユーザー側ではスクリプトさえ用意すればよいので、比較的簡単にCGIを利用することができるわけです。
CGIを利用するにあたって、以下のような条件が必要です。戻る
まず、CGIを設置したいプロバイダで、CGIが使えることが第1条件になります。CGIではサーバー上のプログラムが実行されるので、場合によってはサーバーに重大な影響をおよぼす可能性があります。このため、プロバイダによってはCGIを禁止しているところもあります。
- サーバーがCGIを許可している
- CGI処理に必要なプログラム(Perlなど)が使用できる
- Perlスクリプトのパーミッションを 755に設定できる
- できることなら telnet が利用できる
また、CGIが使える状況だとしても、それを処理するプログラム(Perlなど)が実行できなければ、結局はCGIが利用できないことになります。これらについては、プロバイダごとに方針がありますので、よくわからない場合はプロバイダに直接問い合わせをする必要があります。
次にパーミッションの変更ですが、一般的なWWWサーバーはOSにUNIX系のものが使われることがほとんどです。このUNIXではユーザーごとにファイルにアクセスできるレベル(パーミッション)の設定を行って、実行可能な状態にする必要があります。なお、パーミッションの設定については後で説明します。
最後に、以上の作業を行うにあたって、telnetが利用できるとたいへん便利です。telnetログインすると、サーバー上のプログラムなどをコマンドラインレベルで実行できますので、スクリプトのデバッグやパーミッションの変更など色々な作業が可能になります。
ごく簡単なCGIを、WWWサーバーに設置するまでの手順について解説します。3.1 Perlスクリプトの準備
まずPerlスクリプトを準備します。スクリプトは自分で書いたものでも、あるいは、どこかのサイトからダウンロードしたものでもかまいません。ここでは、以下のような内容のスクリプトでCGIを設置してみることにします。3.2 スクリプトのアップロード
なお、ファイルの拡張子は .cgi に設定して下さい。
Perlスクリプトについては、「CGI Programing with Perl」をご覧下さい。
sample.cgi#! /usr/local/bin/perl print "Content-type: text/html\n\n"; # HTML出力のおまじない print "\n\n"; # ¥nは改行コード print " CGI-SAMPLE \n\n"; print "\n"; print "First Step CGI\n"; print "\n\n";
スクリプトが用意できたら、WWWサーバーにスクリプトをFTPでアップロードします。このときに注意したいことが使用するOSごとの改行コードの違いです。3.3 パーミッションの変更
一般に各OSの改行コードは以下のようになっています。
 OS    改行コード    UNIX    0D    Windows(DOS)    0D-0A    Mac    0A  
このため、Windows上で作ったスクリプトなどは改行コードを変換してやる必要があります。
WindowsからUNIXへのアップロードの場合が多いと思いますので、あらかじめ改行コードを変換しておくか、FTPソフトの機能を使って変換しながらアップロードすればよいことになります。一般には、テキストモード(アスキーモード)でアップロードすればよいです。
アップロードが終わったら、そのスクリプトのパーミッションを設定してCGIとして実行できるようにします。UNIXでのパーミッションについては、詳しく説明していくといろいろあるのですが、ここでは、CGIに関係するパーミッションの変更について解説します。3.4 telnetでの確認
まず、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についてはよくわかっていません(汗)。
パーミッションの設定まで終わると、いよいよスクリプトを実行させるわけですが、このスクリプトがエラーを引き起こしていないか確認する必要があるでしょう。とくにWWWサーバーの場合、自分だけがそのサーバーを利用しているわけではないので、スクリプトのエラーが原因でサーバーがダウンするようなことでは困ります。3.5 ブラウザで実行する
そこで、ホームページでCGIを公開する前に、(できることなら)telnetでスクリプトを実行してエラーを起こしていないか確認したいものです。telnetが解放されているなら、ログインした後スクリプトを実行して、正しくHTMLドキュメントのソースが表示されているかを確認してください。
telnetでログインしてCGIを設置しているディレクトリに移動したら
sample.cgi
と入力してみてください。何も問題がなければ、ヘッダ文(Content-type: text/html)に続いてHTMLドキュメントが表示されるはずです。
単なる文法上の誤りなら、この段階で簡単にチェックできます。
telnetでスクリプトの確認ができたら、いよいよブラウザでCGIを実行します。画面の結果は次のようになるでしょう。戻る
sample.cgiの実行例
WWWサーバーは、自分一人が使うコンピュータではありません。みんなが使用すると言うことを念頭に置いて、思いつくままにCGIを利用する上での注意点をあげてみます。4.1 動作テストは十分に(いきなりブラウザで実行しない)
当たり前のことなのですが、スクリプトの動作チェックは十分に行ってから公開して下さい。特にファイルを扱うスクリプトなどの場合、十分デバッグをおこなってから公開しないと、WWWサーバーに重大なダメージを与えてしまう事があります。4.2 任意のコマンドが実行できるようなスクリプトは書かない
CGIはサーバー上で実行されますので、書き込みの出来る掲示板などの場合、たとえ悪意がなくても、サーバー上のプログラムを実行してしまう可能性がないとも言えません。そのようなことになってしまったとき、あなたは責任がとれますか? 稼働実績があるスクリプトならともかく、自分でスクリプトを作成する場合は、そのあたりを十分に配慮してCGIを設置して下さい。4.3 サーバーに負担がかからないスクリプトを
CGIは通常のWWWサーバーとしての仕事以外の処理を行うため、確実に通常よりもWWWサーバーへの負担が重くなります。無限ループに陥ってしまうスクリプトなどを書いてしまうと、みんながアクセスするサーバーに多大な負担をかけることになります。戻る
このようなことにならないためにも、以下の事に注意してプログラミングをすすめて下さい。
- システムのリソース(メモリ、ディスク、CPU稼働時間など)を食い尽くしてしまう
- 無限ループや、プロセスがロックしてしまう
- 非常に重い処理のスクリプトが同時にいくつも実行されてしまう
設置したCGIがうまく動作しない場合ときなどは、以下の点をもう一度確認してみて下さい。5.1 Perlのパス指定
一般的なUNIXサーバーでは、Perlのパス指定は /usr/local/bin/perl になりますが、サーバーによってはこれが違う場合があります。telnetが使用出来る場合は、自分でPerlの位置を確認することが出来ますが、そうでない場合はプロバイダに問い合わせて確認する必要があります。5.2 スクリプトの転送モード
ちなみに、telnetでの確認方法は以下のようになります。
which perl
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系のサーバーではファイルのアクセス時にフルパスで指定しないと読み書きできないことなどがあります。