windows環境でApache2.2 + mod_perl2

最近のことですがwindows 2003 serverでApache2.2とmod_perl2をセットアップする必要に迫られ、その際にいろいろハマったことがあったので、手順をメモしておきます。

perl5.8.8 + Apache2.2 インストール

  • activestateのサイトからperl5.8.8をダウンロード&インストール
  • apche.orgからApache2.2.Xをダウンロード&インストール

ここまでは何も難しいことはありません。バイナリを持ってきて突っ込むだけです。

mod_perl2 をインストール

ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd

ここに色々書いてあるので事前に一読しておくとよいです。
ちなみにちょっと余談ですが、mod_perl.ppdはApache2.2用でmod_perl-2.0.ppdがApache2.0用です。この名前のつけ方って問題があるなぁと思うんです。。どう見たって勘違いしやすい。というか実際にppdを間違えてインストールしてしまって小一時間はまってしまいましたよ。もう!
で、続きですが、ppmでのインストールの最後の方で「Where should mod_perl.so be placed?[D:/Apache2/modules]」と聞いてくるので、Apache2.2をインストールしたディレクトリの下のmodulesのパスを教えてあげます。今回はデフォルトのパスでApacheをインストールしたので、「C:\Program Files\Apache Software Foundation\Apache2.2\modules」になります。

次にhttpd.confを編集します。こんな感じです。

# to use mod_perl2
LoadFile "C:/Perl/bin/perl58.dll"
LoadModule perl_module modules/mod_perl.so

この時点でmod_perl2自体は動くようになってるはずです。
ですが、Apache2::Requestを使いたいので続けてlibapreq2も入れておきます。

というのは、標準のmod_perlのままだと$r->argsだとそのままのストリングを返すので自分でparseしたりsplitしなければならないので使いづらいし、POSTデータをシンプルには取得できないし(!)、もろもろ「痒いところに手が届かない」状態なので、「Apache2::Requestを使うと良いよ」という推奨が本家サイトで正式になされているようなのです。
http://perl.apache.org/docs/2.0/user/porting/compat.html#C__r_E_gt_args__in_an_Array_Context
なのでlibapreq2を入れておきたい所以です。

libapreq2 をインストール

コマンドプロンプトからppmでlibapreq2をインストールします。

ppm install http://theoryx5.uwinnipeg.ca/ppms/libapreq2.ppd

ここでも上記と同様にppdの名前がややこしいです。Apache2.2用はlibapreq2.ppdで、Apache2.0用がlibapreq-2.0.ppdとなってます。
「なんだよこれ」とか思っていたらApacheのメーリングリストでこんな記述見つけました。

The naming conventions are a bit confusing - Apache2::Request is provided by the libapreq2 ppm package in our repository (libapreq-2.0 if you would have been using Apache/2.0).

bit confusingどころじゃないよ。もう。でもppmパッケージ作っておいてくれたおかげでwindowsにあっさりセットアップできるんだからこれくらいのこと我慢ですね。ありがとう Mr.Randy Kobes。 感謝してます!

さてhttpd.confを編集しておきます。以下を追加です。

# to use mod_apreq2
LoadFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/libapreq2.dll"
LoadModule apreq_module modules/mod_apreq2.so

これでApache2::Requestも使えるようになりました。

さらについでにApache2::Reloadも使えるようにしておきます。

Apache2::Reloadの設定

httpd.confを編集。

# to use Apache2::Reload
PerlModule Apache2::Reload
PerlInitHandler Apache2::Reload
PerlSetVar ReloadDirectories "C:/Program Files/Apache Software Foundation/Apache2.2/perl"
PerlSetVar ReloadDebug On

テスト用スクリプトの用意

挙動確認のため、簡単なハンドラを用意します。ちょー適当です。

package MyHandler;

use strict;
use Apache2::Request;


sub handler
{
	my $r = shift;

	$r->puts(<<"END");
<html>
<body>
<form method="post" action="/perl/">
msg1:<input type="text" name="msg1"><br>
msg2:<input type="text" name="msg2"><br>
<input type="submit" value="Go!">
</form>
<hr>
END
	my $method = $r->method;
	$r->puts("method:", $method, "<p>");
	my $req = Apache2::Request->new($r);
	my @params = $req->param();
	for(@params){
		$r->puts($_,":",$req->param($_),"<br>");
	}
	$r->puts('</body></html>');
	return Apache2::Const::OK;
}

1;


これを動かすためのhttpd.confはこれ

PerlRequire "C:/Program Files/Apache Software Foundation/Apache2.2/perl/startup.pl"
<Location /perl>
	SetHandler perl-script
	PerlResponseHandler MyHandler
</Location>

startup.plはuse libしてるだけです。なので説明は割愛。


これでブラウザからhttp://localhost/perlで確認するとテキストボックス2つとmethod種およびparamを表示する画面が見えるはずです。
テキストボックスに適当な文字を入れてGoをクリックするとPOSTメソッドでデータが投げられます。その様子が下の表示部分で確認できると思います。またURLに「?msg1=hello&msg2=world!」のようにQueryStringとしてデータを渡してやるとGETメソッドでparamとして取得できたことがわかるはずです。

なんだかすごく当たり前のことができただけなのですが。。。

mod_perlでPOSTデータを取得するためにはApache2::Requestが良いということなので、そこの部分の手順を書きたかっただけなんですが、やたら面倒な説明になってしまいました。


疲れた。。。orz
[[]]