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をロードするように注意書きがあってハマることはなかった。

複数サイズのfaviconを作成するワンライナー

convertコマンドの-cloneオプションを使えばワンライナーでマルチサイズfaviconを作成できる。

以前faviconを作成する方法を書きました1が、convertコマンドの-cloneオプションを使えば、もっと簡単に複数サイズのデータを持ったicoファイルを作成できる2ことがわかりました。

faviconをワンライナーで作成

アイコンの元となる画像をfavicon.pngだとすると、次のコマンド一発で複数サイズfavicon.icoを作成できます3

convert favicon.png \
	\( -clone 0 -resize 16x16 \) \
	\( -clone 0 -resize 32x32 \) \
	\( -clone 0 -resize 48x48 \) \
	\( -clone 0 -resize 150x150 \) \
	-delete 0 favicon.ico

注意:シェルが解釈しないようにするため括弧をバックスラッシュ(円記号)でエスケープする。

このワンライナーが何をしているかというと…

  1. favicon.pngをlayer 0に読み込む。
  2. 括弧内を処理して、その結果を新しいlayerに置く。
  3. 括弧内では、-clone 0でlayer 0すなわちfavicon.pngをコピーして指定のサイズに縮小する。
  4. layer 0の元画像を削除して、favicon.icoに合成する。

色数を制限したいときには、-colorsオプションを加えます。例えば-colors 256とすると、256色に制限できます。

参照と注釈