自分はほぼ全てのWeb系のプロジェクトをmod_perlで行っているわけですが、これを毎回サーバーにログインして作業するわけには行かない時が結構ある。特に毎日あちこちに移動している自分としては常に快適に作業が出来る程の高速回線があるとは限らないので、最近は特にローカルマシンで作業をしたい事が多い。



http://localhost/project1/
http://localhost/project2/
http://localhost/project3/

みたいな感じでアクセスできるようにしたいのだけど、ここで問題は実際の稼働環境とホスト名やらパスやらが違う事。これを吸収するためにはまずApacheの管理から考え始める:httpd.confに直接ガリガリ書き込む人も多いのだけれども、スムーズな開発→本番への移行を考えるなら折角存在するIncludeディレクティブを使用しない手はない



[httpd.conf]
...
Include /path/to/project1/misc/httpd.conf

本番マシンでは以上のように設定する事によって、ローカルのマシンではこのInclude行を繰り返せば設定できるようになる。



Include /path/to/project1/misc/httpd.conf
Include /path/to/project2/misc/httpd.conf
Include /path/to/project3/misc/httpd.conf

さて、今度はそれぞれのプロジェクト。問題は本番環境では



http://project1.mydomain.com/hoge.html

とアクセスするところを



http://localhost/project1/hoge.html

に行くようにする。このためにはmod_rewriteを使わないといけないが、そのためにはさらに*他のプロジェクトの邪魔にならないように*URLの書き換えを行わないといけない。



RewriteEngine On
RewriteRule ^/project1/(.*)$ /path/to/project1/htdocs/$1 [L]

そうしておいて



PerlRequire /path/to/project1/misc/startup.pl
<Directory /path/to/project1/htdocs>
SetHandler perl-script
</Directory>

みたいな感じで設定しておく。この時点ですでにベタ打ちの設定箇所があちこちにあるのですでに本番サーバーになかなか移行できなさそうな匂いがぷんぷんするのでパス名とかを後で代入できるようにする(ここでText::Template等を使ってもいいのだが、この程度のテンプレーティングで依存関係を増やすのもアレなので手動で)



RewriteEngine On
RewriteRule ^%ProjectPrefix%/(.*) %ProjectHome%/$1 [L]
PerlRequire %ProjectHome%/misc/startup.pl
<Directory %ProjectHome%/htdocs>
SetHandler perl-script
</Directory>

こんな感じにしておいて、httpd.conf.inに保存。ローカルマシンでは%ProjectPrefix% = '/project1'、本番では%ProjectPrefix% = ''等になるように置換してhttpd.confに書き込む簡単なスクリプトを書いておけば開発と本番環境を比較的簡単に切り替えられる。


俺はこの手法をstartup.plにも適用して、@INCパスやらその他設定項目を変えてやってみた。以上半分くらいメモ代わりに。