CGI セッティング 7 ヶ条

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

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

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

CGI ファイルの転送モードに注意

手に入れた CGI 関連のファイルのほとんどはテキストファイルです。 それらのファイルをレンタルサーバへアップロードするときには、もし CGI のマニュアルに転送モードの指定があれば、 必ずそれに従ってください。指定がなければ BINARY モードで転送することをお勧めます。 CGI に同梱されてるファイルの中には ASCII モードで転送すると壊れてしまうファイルが存在している 可能性がありますので注意が必要です。

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

まず、転送モードを理解する前に「改行コード」を理解しなくてはいけません。 世の中、Windows しかないなら問題にならないのですが、「Unix」「Mac」などさまざまな OS が存在しております。 OS によって、テキストの改行を示すコードが異なります。 Perl や PHP などのプログラミング言語自体は改行コードを意識しなくても動作するのですが、 それを CGI として動作させたい場合は、OS に合わせた改行コードでないと実行することができません。

改行コードを確かめるには、Windows なら標準テキストエディター「メモ帳」を使うとよく分かります。 ウィンドウ最下部のステータスバーに改行コードが表示されているはずです。

Windows 改行コードの場合
UNIX 改行コードの場合
Mac 改行コードの場合

実は CGI ファイルの 1 行目には #!/usr/bin/perl のように Perl のパスが記述されています。 この最初の行は Perl スクリプトではありません。OS が CGI を実行するために読み取る行です。 そのため、この行の改行コードが OS の改行コードと一致していないと、OS はその Perl スクリプトを CGI として実行できないとうわけです。

近年、多くの FTP ソフトでは転送モードのデフォルト値を BINARY にしているようです。 また、ソフトによっては転送モードの設定を分かりづらい場所に置いているため、転送モードのことを意識せずとも BINARY モードで転送しているはずです。

しかし FTP ソフトによっては触れやすい場所に転送モードの設定があり、誤って転送モードを ASCII モードに変更 されている場合も考えられます。 ASCII モードは改行コードを送信先のサーバの改行コードに変換して送るモードです。 強制的に ASCII モードでファイルをサーバーに転送してしまうと、画像などのバイナリーファイルが壊れてしまう 可能性が出てきますので注意が必要です。

FTP ソフトによっては、「ASCII モード」を「テキストモード」と表記しているものもあるようです。 代表的な Windows 用 FTP ソフト「NextFTP」であれば、画面上部のツールバーに転送モード切り替えボタンが 配置されています。

NextFTP
NextFTP

perl のパスを確認

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

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

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

また 1 行目の Perl のパスを書き換えて保存する際に改行コードに気を付けてください。 近年のほとんどのテキストエディタはファイルを開いた時点の改行コードと同じ改行コードで 保存してくれますが、場合によっては Windows であれば CRLF に変換されてしまう可能性があります ので注意してください。

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

近年、Perl で作られた CGI は zip など圧縮された状態で配布されていますが、 展開するとかなりの数のファイルがあることに気付くでしょう。 これら一連のファイルはすべてアップロードしましょう。

ファイルの数が多い場合、FTP でまとめてサーバーにアップロードすると、 状況によってはコネクションが切断されてしまい、うまくアップロードされたと思っても、 実は最後までアップロードされていないことがあります。

もし CGI がうまく動作しない場合は、再度、すべてのファイルを上書きでアップロード してみると良いでしょう。

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

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

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

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

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

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

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

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

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

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

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

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

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

もし、あなたの使っているレンタルサーバー事業者のサーバが、オーナーの権限で実行するようになっていれば、 (2) の部分の実行権限「x」が必要なわけです。 もし、nobody などの特別なアカウントで実行するようになっていれば、 (4) の部分の実行権限「x」が必要となります。

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

-
Step1
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

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

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

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

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

しかし、

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

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

全角スペースに注意!

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

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

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

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

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

パスの意味に注意!

一般に配布されている CGI の多くは、みなさんがカスタマイズできるように設定項目があります。 CGI セットアップ後にウェブブラウザーで設定するのであれば問題ないのですが、 CGI ファイルを直接編集するものについては注意が必要です。

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

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

ディレクトリ構成 相対パス 絶対パス
📂 / (サーバのルート)
📂 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 系 OS ですので「/home/hoge」のような記述になります。

通常は絶対パスを指定する必要がある CGI は多くはないと思いますが、もし絶対パスが必要なのであれば、 ご自分のホームディレクトリの絶対パスはご利用のレンタルサーバー事業者に確認してください。