mod_perl その3


わかったことや、やったことをメモメモ。

Linux鯖にmod_perlを導入。

周辺の環境
Apache2.2.11 + Perl5.8.8 + mod_perl2.0.4

wget http://perl.apache.org/dist/mod_perl-2.0.4.tar.gz
tar xvyf mod_perl-2.0.4.tar.gz
cd mod_perl-2.0.4

perl Makefile.PL \
USE_APXS=1 \
WITH_APXS=/usr/local/apache2/bin/apxs \
EVERYTHING=1

make && make install

Makefile.PLでmakefile作るとき、apacheのapxsの位置を指定するように言われる。
オプションで設定した意味って・・・ ・x・;

httpd.conf
LoadModule perl_module modules/mod_perl.so

<Directory "/public_html">
    <Files *.pl>
        SetHandler perl-script
        PerlHandler ModPerl::Registry
        PerlSendHeader On
    </Files>
</Directory>


これで/public_html以下にある*.plはmod_perlスクリプトとして実行される。


メモ


プログラムの更新で再度読み込みがされるが、呼び出されるモジュールは再読み込みされない。
モジュールを再読み込みさせるにはapacheの再起動が必要。
もしくは、PerlInitHandler Apache::Reloadとやっておく


chdirで移動させるのはよくないっぽいので、
SCRIPT_FILENAMEか$0からカレントディレクトリを取得して、$CR_DIRとか適当に変数にいれて、
ファイルの読み書きのときに、open(FP,"${CR_DIR}/xxx.txt");みたいに指定するのが無難ですかね。
モジュールの読み込みは1度のみだから、BEGINブロックで@INCに$CR_DIRをunshiftしておけば、
初回のuseは問題なく実行される。eval("use モジュール名;1;");とかやってたらダメっぽいけど。


chdirとかカレントディレクトリを意識しないといけないとかわずらわしい。
それをどうにかする方法もあるようで。
httpd.confで
PerlHandler ModPerl::RegistryPrefork
ってやると、chdirをしなくてもカレントディレクトリがスクリプトと同じディレクトリになる。
ならとりあえずこれにしたら幸せになるの?となるけど、よくわからない。
日本での情報少なすぎる!!