CGIセッティングの7ヶ条

 ホームページや、書籍などでフリーで公開されているCGIをセットアップしたけど、うまく動かなくて困っていませんか? 「Internal Server Error」って出てきませんか? うまく動かないには、ほとんどの場合、セットアップする側に問題があります。しかし、原因がわかりませんよね。

実は、wwwサーバが出力するエラーログから、CGIが動かなかった理由のヒントが得られるのです。しかし、ほとんどのプロバイダーではこのエラーログを見ることができません。したがって、自分で原因を探るしかないのです。

しかし、原因はさほど多岐にわたりません。以下に示す7ヶ条を読んで、もう一度、お試しのCGIを確認してみてください。これで、悩みも解決するかもしれませんよ。

CGIファイルは、すべてASCIIモードで転送

手に入れたCGI関連のファイルのほとんどは、テキストファイルです。それらのファイルをレンタルサーバへアップロードするときには、もしCGIのマニュアルに指定がなければ、必ずASCIIモードで転送してください。仮にBINARYモードで転送すると、「Internal Server Error」となってしまう場合があります。

もしCGIのマニュアルに転送モードの指定があれば、必ずそれに従ってください。CGIに同梱されてるファイルの中には、ASCIIモードで転送すると壊れてしまうファイルも存在している可能性がありますので、注意が必要です。

FTPソフトでよく「転送モード自動判定」なる機能がありますが、信用してはいけません。転送モード自動判定は、転送するファイルが、既知の拡張子であれば、問題なく判別してくれますが、そうでないものは、BINARYモードで転送するようです。したがって、手間かと思いますが、あえてASCIIモードを指定して、CGIファイルを転送してください。

ところで、そもそも「転送モード」って何なのかご存知ですか? 簡単に説明します。

まず、転送モードを理解する前に、「改行コード」を理解しなくてはいけません。世の中、Windowsしかないなら問題にならないのですが、「Unix」「Mac」などさまざまなOSが存在しております。OSによって、テキストの改行を示すコードが異なるのです。したがって、Windows上で作ったテキストファイルをUNIX上で見たとしても、改行を正しく理解してくれません。逆に、UNIX上で作られたテキストファイルをWindows上で見たとしても、同様です。この場合、Windows標準テキストエディター「メモ帳」を使うとよく分かります。UNIX上の改行コードが理解できずに、黒塗り文字で表現されてしまい、さらに1行とみなされてしまいます。

Windows改行コードの場合 UNIX改行コードの場合
メモ帳 Windows改行コードの場合 メモ帳 UNIX改行コードの場合

これと同様のことが、UNIXサーバ上で起こるわけです。つまり、Windows上で作成した、もしくは編集したCGIファイルを、BINARYモードでサーバへ転送してしまうと、サーバではCGIファイルの改行が読み取れずに、1行だけのファイルとみなしてしまいます。したがって、「Internal Server Error」がでてしまうわけです。

さて、ASCIIモードですが、このモードは、改行コードを、送信先のサーバの改行コードに変換して送るモードなのです。

FTPソフトによっては、「ASCIIモード」を「テキストモード」と表記しているものもあるようです。代表的なWindows用FTPソフトの「ASCIIモード」への切り替えを紹介します。

NextFTP NextFTP

NextFTP NextFTP

ウィンドウ上部の「abc」ボタンを押してください。この状態で転送すれば、ASCIIモードとなります

FFFTP FFFTP

FFFTP FFFTP

ウィンドウ上部の「A」ボタンを押してください。この状態で転送すれば、ASCIIモードとなります。

FTP Explorer FTP Explorer

FTP Explorer FTP Explorer

ウィンドウ上部の「A」のボタンを押してください。この状態で転送すれば、ASCIIモードとなります。

perlのパスを確認

 各CGIファイルには、1行目に必ず「#!/usr/bin/perl」のような記述があるはずです。ここの記述は、レンタルサーバによって異なります。必ずレンタルサーバが指示するように記述してください。ただ、ほとんどのレンタルサーバでは、「#!/usr/bin/perl」で問題ないようです。

しかし、「#!/usr/local/bin/perl」「#!/bin/perl」の場合も否定できませんので、必ず確認してください。

ちなみに、この記述は1行目でないと意味がありません。2行目、3行目に記述されていたとしても意味をなしませんので、ご注意ください。

ダウンロードしたファイルは、すべてアップロード

 ダウンロードしたCGIの一連のファイルは、すべてアップロードしましょう。本体のCGI以外にも、「jcode.pl」や「cgilib.pl」などのライブラリー関連を必要とする場合が多々あります。本体のCGIは、これらのライブラリーがないと動作しません。また、これらのライブラリーを設置する場所(ディレクトリ)にも気をつけましょう。ほとんどが、本体のCGIと同じディレクトリにアップロードすれば動作します。

本体のCGIのソースをみて、これらの情報を得ることができます。たとえば、

require 'jcode.pl';

とあれば、本体のCGIと同じディレクトリに、「jcode.pl」が必要ということです。「require './jcode.pl';」のように、「./」があっても同じ意味です。

パーミッションを正しく設定

 CGIのファイルをサーバへアップロードしただけでは、絶対に動きません。必ずプロバイダー指定のパーミッションに変更する必要があります。では、パーミッションとは何でしょう。主に数字3桁で表現されますが、「-rwx---r-x」と表記する場合もあります。

まず、パーミッションの説明をするにあたって、「-rwx---r-x」の表記を理解しましょう。この表記は大きく4つのパートに分けられます。

- r w x - - - r - x
(1) (2) (3) (4)

(1) ファイルなのかディレクトリ(フォルダ)なのかを識別します。もしファイルであれば、「-」となり、ディレクトリであれば、「d」となります。

(2) オーナーのパーミッションです。オーナーとは、持ち主のことで、あなたがお使いのアカウントのことを指します。「r」「w」「x」のアルファベットの意味は、次のとおりです。

読み取り権限 ファイルの中身を見ることができるかどうかをあらわします。権限がない場合には、「-」となります。
書き込み権限 内容を更新したり、削除することができるかどうかをあらわします。権限がない場合には、「-」となります。
実行権限 ファイル(CGI)を実行できるかどうかを表します。権限がない場合には、「-」となります。

(3) グループのパーミッションです。UNIXの世界には、アカウントという概念に加え、グループという概念があります。すべてのアカウントは何かしらのグループに属することになります。(3) の部分が示すパーミッションは、そのグループに属するすべてのアカウントに対して適応されます。(3) の部分は3つに分かれますが、(2) と同様、左から「読み取り権限」「書き込み権限」「実行権限」をあらわします。例では、すべて「-」ですので、同じグループに属する他のアカウントの権限では、見ることすらできないということです。

(4) 本人でもなければ、本人が属するグループでもないアカウントに対して適応されるパーミッションです。

今までの説明では、分かったようで分からなかったかもしれませんね。具体例を見ながら理解していきましょう。

まず、FTPでファイルをアップロードしたり、削除する場合を考えてみましょう。FTPでアクセスしたということは、オーナーの権限でアクセスしていることになります。したがって、?Aのパーミッションが適応されます。読み取り権限「r」があれば、そのファイルをダウンロードすることができます。もし読み取り権限がないと、自分のファイルなのに、ダウンロードすることすらできないのです。次に、書き込み権限「w」があれば、削除することができます。もし、書き込み権限がないと、削除することができません。もちろん、上書きでアップロードすることもできません。

次に、例をかえて、ブラウザーであなたのホームページを見るときを考えてみましょう。ブラウザーであなたのページ(ファイル)を見るときには、通常、「nobody」などの専用のアカウントの権限でみることになります。つまり、オーナーでもなければ、グループにも属さないアカウントで、あなたのファイルを見ようとしているわけです。この場合、?Cの読み取り権限「r」が必要なわけですね。もし、?Cの読み取り権限がない場合には、あなたの作ったホームページをブラウザーから見ることができなくなります。逆に、見せたくない場合に、この手段を使うわけです。

最後に、実行権限「x」ですが、CGIを例にたとえます。どのアカウントでCGIが起動されるかということにかかわってきます。どのアカウントの権限で実行するかどうかは、プロバイダーによって異なりますが大きく分けて2つしかありません。

もし、あなたの使っているプロバイダーのサーバが、オーナーの権限で実行するようになっていれば、?Aの部分の実行権限「x」が必要なわけです。もし、nobodyなどの特別なアカウントで実行するようになっていれば、?Cの部分の実行権限「x」が必要となります。

さて、パーミッションの意味がなんとなくわかったところで、3桁の数字で表記するにはどうすればよいのでしょうか。変換の手順は、下図のとおりです。

r w x - - - r - x
Step1
1
Step2
           
Step1

権限があるものに対して、「1」を割り当て、権限のないものについては、「0」を割り当てます。つまり、「r」「w」「x」それぞれに対しては「1」を、「-」に対しては「0」を割り当てます。

Step2

オーナー権限、グループ権限、その他の権限に分割します。つまり、頭から3つづつに区切ります。その区切りごとに、2進数の数字とみなし、それを10進数に変換します。たとえば、2進数で「111」であれば、10進数では「7」となります。以下に3桁の2進数の数字に対して、10進数ではどうなるかを下表まとめましたのでご覧ください。

パーミッション 2進数 10進数
--- 000
--x 001
-w- 010
-wx 011
r-- 100
r-x 101
rw- 110
rwx 111

パーミッション変更方法

パーミッションの変更は、FTPソフトによって異なります。それぞれのパーミッション変更方法を紹介します。

ダブルクォーテーションとシングルクォーテーションに注意!

 CGIをカスタマイズするにあたり、設定内容を変更することがあろうかと思います。たとえば、

$mail = 'foo@bar.co.jp';

とあった場合、メールアドレスの部分を変更するとします。この例では、メールアドレスがシングルクォーテーションで囲まれています。このときには、何も気にせず、そのままメールアドレスを書き換えてあげれば問題ありません。ただし、シングルクォーテーションを入れることはできません。

しかし、

$mail = "foo\@bar.co.jp";

のように、ダブルクォーテーションで囲まれている場合には、注意が必要です。指定する文字列の中に「"」「@」「$」「\」「%」を指定したい場合には、その記号の前に「\」を入れる必要があります。例では、$mail という変数に、「foo@bar.co.jp」を指定したかったのだが、「@」が含まれているので、「@」の前に「\」を加えているということです。

全角スペースに注意!

 CGIのカスタマイズで、ソースを書き換える場合に、全角スペースが入らないように注意しましょう。Perlスクリプトでは、全角スペースと半角スペースはまったく別物です。全角スペースが入ってしまった場所によっては、CGIが起動できません。

CGIを書き換えるときには、全角スペース、タブ、改行などを視覚的に見ることができるテキストエディターをお使いになることをお勧めします。

TeraPad TeraPad

TeraPad

EmEditor EmEditor

EmEditor

ViVi ViVi

ViVi

さて、全角スペースがどのような場所に入ると駄目になるかを例で示します。例では全角文字を「」であらわしております。

  1. $var = 'Hellow!';
  2. $var= 'Hellow!';
  3. $var ='Hellow!';
  4. $var = 'Hellow!';
  5. $var = 'Hellow!';

(1) ~ (4) はすべてエラーとなってしまいます。(5) はエラーにはなりません。つまり、シングルクォーテーションもしくはダブルクォーテーションで囲まれた中であれば、問題ありません。

パスの意味に注意!

 一般に配布されているCGIでは、ほとんど、みなさんがカスタマイズできるように、設定項目があります。CGIファイルをテキストエディターで開くと、上のほうにそれらの項目欄が記述されているかと思います。その設定の記述で、「フルパス」「相対パス」という言葉が出てくるかと思います。これらの意味を取り違えると、CGIが動作しなくなります。

パスの意味には、大きく分けて2つあります。

以下のディレクトリ構成を例にとり説明します。

ディレクトリ構成 相対パス 絶対パス
/ (サーバのルート)
home/
hoge/
index.html
../index.html /home/hoge/index.html
cgi-bin/
 this.cgi
config.dat
./config.dat /home/hoge/cgi-bin/config.dat
dir/
file.log
./dir/file.log /home/hoge/cgi-bin/dir/file.log
images/
image.gif
../images/image.gif /home/hoge/images/image.gif

相対パス

CGIファイルから見て、どこにあるかを示します。上図では、「this.cgi」から見た、各ファイルを相対パスを記載しております。同じディレクトリ内を示す場合には、「./」、一つ上のディレクトリを示す場合には、「../」をファイル名の前につけます。2つ上のディレクトリの場合には、「../../」をファイル名の前につけます。

絶対パス

サーバのルートディレクトリから見てどこにあるかを示します。Windowsでいえば、「C:\windows\system」と指定するようなものです。ほとんどのサーバは、UNIXですので、「/home/hoge」のような記述になります。プロバイダーでご利用の、ご自分のホームディレクトリの絶対パスは、ご利用のプロバイダーに確認してください。