CGIプログラムが動かずにソースが表示される
設定は正しいのに CGI プログラムのソースが表示されてしまう原因は、mod_cgi がロードされていなかった。
Apache を使った Web サーバを新規にセットアップしたら CGI プログラムが動かないで、そのソースコードが表示されてしまう問題にぶつかりました。
まず最初に考えるのは、設定が間違っているのではないかということです。そこで既に動いているサーバから設定ファイルを持ってきて見ましたが、やはり新規サーバではソースコードが表示される問題が発生していまします。
ググっても有用なページを見つけることができずさんざん悩んでしましました。
仕方なしに一息入れて頭をリセットすると、設定ファイルに現れない設定が間違っていることに気が付きました。
Apache で CGI を有効にする設定
見落としていた CGI 設定のが何であったかという前に、CGI を有効にする Apache の設定を再度確認しておきましょう。
Apache で CGI を有効にする設定にはに二種類あります(注1)。
- ScriptAlias を使う。
- 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.load
をmods-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 プログラムが動くようになるはずです。
参照と注釈
- Apache Tutorial: CGI による動的コンテンツ – Apache2.0
Apache2.0のドキュメントを参照したのが悪かった。最新のマニュアルを参照していれば、最初にmod_cgiをロードするように注意書きがあってハマることはなかった。