CGIで Internal Server Errorが出た時の対応方法

アプリ開発

「WebServerを構築してしてPerlを動かしたい」という方はたくさんいらっしゃると思います。

特に最近ではサーバを安価に外部委託できるのに付加して、掲示板の機能など様々な機能が付加した状態でWebサーバをレンタルできる事が多いです。

私もこの間、社内のサーバでWebサーバ上でPerlの掲示板を使いたい要件を受けて作成してみました。ですが意外と躓く事が多かったですので、こちらに記載しておきます。

CGIが動かない!

結論から言いますとこのCGIが動かない場合はプログラムの記述方法、アップロードの仕方、下準備をきちんと準備してからでないとうまく動かないという事がわかりました。

気を付ける所と言えば/etc/httpd/conf/httpd.confの設定を、きちんと記述することでしょうか。

もう少し詳しく説明するとhttpd.confのCGI設定の下記2カ所間違えないで、記載すればほぼテスト環境としては動きます。

  • Options Indexes FollowSymLinks ⇒ Options Includes ExecCGI FollowSymLinks
  • #AddHandler cgi-script .cgi ⇒ AddHandler cgi-script .cgi .pl

たったのこれだけです。

CGIテスト

次にWebサーバのサービスを起動して適当なテストページ(html)をFTPで/var/www/html配下に置いてWebサーバでテストページが表示されるか確認します。

続いて下記のようなCGIテストページを同じ場所に置いてテストを実施します。

#!/usr/local/bin/perl –
print “Content-type: text/html\n\n”;
print “<html>\n”;
print “<head>\n”;
print “<meta http-equiv=\”Content-Type\” content=\”text/html; charset=UTF-8\”>\n”;
print “<title>テスト</title>\n”;
print “</head>\n”;
print “<body>\n”;
print “CGIテスト\n”;
print “</body>\n”;
print “</html>\n”;

まぁなんてことはないソースですね。ただCGIテストと表示させるだけです。

▼そしてhttp://localhost/test.cgiにアクセスしますが下記のようなエラーが出てしまいます。
エラー表示

まぁこのCGIのエラーは色々な方々が様々な所で記述されている事を見ると本当に多い事象に思います。そしてそれらの対応について様々な記述Webで散見されます。中にはこれ記述しても大丈夫か?と思うような間違った記述さえあります。

まずこの時点でWebサーバについては起動しているのであれば、よっぽどの事がない限りhttpd.confが違っているという事は無いと思います。Apatcheのサービス起動時にエラーが出ますしね。

他に疑うべき原因

次に疑うのはパーミッション(Windowsで言う権限)の問題です。今回このtest.cgiには755を与えるように以下のコマンドを実行しています。

chmod 755 /var/www/html/test.cgi 問題ないですね。

次に疑うのがパールのパスですがwhereis perlコマンドで検索すると[ソースファイル]と同じパスがでてくるのでこれもOKです。

こちらのサイトを参考にさせていただきました。

あとは改行コードかUTF-8の問題です。この時点で一度エラーログを見てみる事をお勧めします。

エラーログは /var/log/httpd/error_logですのでこちらの内容を確認すると大体「Exec format error…」と出ているのではないでしょうか。このエラーが検出された場合は自分がアップロードしたファイル、自分のアップロード環境を考えてみましょう。

私がエラーで困っていた環境はTeraTermを使用してコピペでファイルを更新するというものでした。もしくはTextエディタで記述してFFFTPでアップロードというパターンも多いですよね。しかしこのTextエディタが以外と曲者です。

今回このエラーを回避すべくテキストエディタを捨てて秀丸君をインストールてテストページを作成しました。

▼注意すべきはこれ 「UTF-8」で「自動改行がLF」「BOMをつけるにチェックがない事」
UTF-8

これで自分のローカルCGIはうまく出来ていると思います。
▼そしてもう一点注意点としてはFFFTPを使うときに「アスキー転送モード」を必ず使う事です。
FFFTP-転送モード

▼これでおそらくCGIは下記のように動いてくれるはずです。
CGIテスト

最後に

こういったサーバ・サービスが動かないといった場合、まず最初に疑われるのがサーバの設定ですが

ローカルの作成環境やアップロードファイルについても、十分に注意して見てみる事も重要だと気付かされました。