CGIプログラムが動かずにソースが表示される

目次

設定は正しいのに CGI プログラムのソースが表示されてしまう原因は、mod_cgi がロードされていなかった。

Apache を使った Web サーバを新規にセットアップしたら CGI プログラムが動かないで、そのソースコードが表示されてしまう問題にぶつかりました。

まず最初に考えるのは、設定が間違っているのではないかということです。そこで既に動いているサーバから設定ファイルを持ってきて見ましたが、やはり新規サーバではソースコードが表示される問題が発生していまします。

ググっても有用なページを見つけることができずさんざん悩んでしましました。

仕方なしに一息入れて頭をリセットすると、設定ファイルに現れない設定が間違っていることに気が付きました。

Apache で CGI を有効にする設定

見落としていた CGI 設定のが何であったかという前に、CGI を有効にする Apache の設定を再度確認しておきましょう。

Apache で CGI を有効にする設定にはに二種類あります(注1)。

  1. ScriptAlias を使う。
  2. Handler と ExecCGI を使う。

Ubuntu のパッケージで Apache をインストールすると、設定ファイルは/etc/apache2/sites-enabled/000-default.confです。このファイルには最初から<VirtualHost>指定が書き込まれているので、この中に CGI の設定を挿入します。

ScriptAlias を使う。

ScriptAlias /url/ /abs/dir/

とすると、/abs/dirにある実行ファイルが全て CGI プログラムと認識されます。そして/url/cgiにアクセスすると、/abs/dir/cgiが実行されます。

/abs/dirは、通常のファイルとしてアクセスできないように html の DocumentRoot 外に置きます。また/abs/dirの実行ファイルは全て CGI として実行できてしまうので、CGI スクリプトのバックアップファイルが残っていたりしないよう注意する必要が有ります。

Handler と ExecCGI を使う。

特定の拡張子を持ったファイルのみを CGI プログラムとして実行したいときは、こちらの設定を使用します。

<Directory /var/www/html/cgi-dir>
  AllowOverride None
  Options +ExecCGI
  AddHandler cgi-script .rb .sh
</Directory>

# or

<Location /cgi-dir>
  AllowOverride None
  Options +ExecCGI
  AddHandler cgi-script .rb .sh
</Location>

この設定では、/var/www/html/cgi-dirにある*.rbまたは*.shというファイルが CGI プログラムとして認識されます。

その結果 DocumentRoot が/var/www/htmlだとすると、/cgi-dir/cgi.rbにアクセスすると/var/www/html/cgi-dir/cgi.rbが実行されます。

Handler で指定されなかった/var/www/html/cgi-dirにあるファイルは、CGI プログラムとして実行されることはありません。しかし通常のファイルとしてアクセスすることが可能ですので、CGI スクリプトのバックアップファイルなど CGI プログラム以外のファイルを置かないように注意する必要が有ります。

500 Internal Server Error

Internal Server Error と表示されるときには、次の点を確認します。

  • CGI プログラムにアクセスする URL に間違いがないか。
  • CGI プログラムの実行フラッグ(x)がセットされているか。
  • CGI プログラムにエラーがあって異常終了していないか。

CGI スクリプトが動かないでソースが表示されるときには、設定が間違っていて CGI プログラムと認識されていませんので、設定ファイルをもう一度確認します。

見落としがちな CGI を有効にする設定

設定ファイルに絶対間違いはないのに CGI プログラムが動かず、そのソースが表示されるときにはどうしたら良いんだろう?

その場合は、Apache に CGI を実行するモジュールが組み込まれているか確認します。

$ sudo apache2ctl -M|grep cgi
 cgi_module (shared)

このコマンドでcgi_moduleが表示されない時には、Apache に CGI モジュールが組み込まれていません。

Ubuntu の Apache パッケージで CGI モジュールを読みこませるには、/etc/apache2/mods-available/cgi.loadmods-enabledにコピーまたはリンクを作成します。

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgi.load .
$ ls -l | grep cgi
lrwxrwxrwx 1 root root 26 11月  3 11:58 cgi.load -> ../mods-available/cgi.load

これで Apache を再起動すると CGI プログラムが動くようになるはずです。

参照と注釈

  1. Apache Tutorial: CGI による動的コンテンツ – Apache2.0
    Apache2.0のドキュメントを参照したのが悪かった。最新のマニュアルを参照していれば、最初にmod_cgiをロードするように注意書きがあってハマることはなかった。