続・Apache 2.0の設定

こないだは入れただけの状態でhttpd.confも変えずにルートを見たり、ユーザディレクトリにpublic_htmlディレクトリを作ってindex.htmlを作って見ただけだったので、今日はCGIとかやってみる。

デフォルトのCGI設定

デフォルトの状態だと/usr/pkg/libexec/cgi-binが/cgi-binとして見えるようになってるんだけど、このcgi-binディレクトリに置いてあるサンプルCGIスクリプトはどれも実行属性が付いていないのでInternal Server Errorになってしまう。てな訳で実行属性を付けてみる。

# cd /usr/pkg/libexec/cgi-bin
# chmod +x printenv
# chmod +x test-cgi

だけど、http://192.168.0.79/~tamura/test-cgiは動くようになるものの、printenvの方は動かない。これはtest-cgiがshのスクリプトなのに対して、printenvはPerlスクリプトPerlのある場所の指定が/usr/local/bin/perlになってるのが原因だった。
今回はパッケージでPerlを入れてるので/usr/pkg/bin/perlにprintenvスクリプトを書き換えてもいいんだけど、Perlスクリプト入れるたびに変更するのも面倒なのでシンボリックリンクを張っておくことにする。あら、/usr/localディレクトリって最初は無いのか。

mkdir -p /usr/local/bin
ln -s /usr/pkg/bin/perl /usr/local/bin/perl

この設定そのものはhttpd.confの中のScriptAliasで行われている。この場合、cgi-binディレクトリに入れておく、CGIスクリプトの拡張子は何でもいい。

# このディレクトリ中の全てのファイルを CGI プログラムであると仮定します。
ScriptAlias /cgi-bin/ "/usr/pkg/libexec/cgi-bin/"

他のディレクトリでCGIを使えるようにする

のように指定されたディレクトリ内の動作を決めるトコにOptionsって項目があるので、これをAllにするか、ExecCGIを追加する。

<Directory /home/*/public_html>
    Options All

これに加えて、httpd.confの最後の方にCGIスクリプトとして認める拡張子を指定する。Perlのために「.pl」、Rubyのために「.rb」を加えておくと吉かも知れない。

AddHandler cgi-script .cgi

SSIを使えるようにする

CGIと同じくOptionsって項目をAllにするか、Includesを追加する。
さらにSSIであることを示す拡張子を以下のように指定する。

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

.htmlファイルでも実行属性を付けたらSSIになるようにしたい場合は、先ほどのOptionsの項目の下にでも「XBitHack on」の1行を追加する。(Apache 2.0では.htaccess内でAddType使って.htmlを再定義するとXBitHackが無効になるので、.htaccess内にXBitHack onを追加で記述する必要がある。)

.htaccessを使えるようにする

CGIやSSIと同じくOptionsって項目の下にでも「AllowOverride All」の1行を追加すれば、ユーザが.htaccessを適当なディレクトリに配置すれば、その中でのSSIやCGIの設定を自由に変更できる。

index.htmlの有無

CGIやSSIと同じくOptionsって項目をAllにするか、Indexesを追加すると、index.htmlなどが無い場合にディレクトリ内のファイル一覧表示が出来るようになる。
index.htmlって名前はDirectoryIndexで指定されているので、index.htmやindex.cgiを有効にしたい場合は下記のように変更する。

DirectoryIndex index.html index.html.var index.htm index.cgi index.shtml

データの移行

現行のApache 1.3系で動いている各ユーザのpublic_htmlをtarで固めて移行する時は、tarで解凍する際にpオプションを付けなければ、オーナー情報やパーミッションが正しく復元されないので注意。(例:tar zxvfp webdata.tar.gz)
あと、新しいサーバで一般ユーザが所属するグループが違う(以前はuserだったのがusersになった等)場合は、/etc/groupに古いグループ名を追加して、移行するユーザ名を列挙しておく。(例:user:*:1001:nyano,tamura,taketyon)