10分で完了、mod_perl 2.0 で Hello, World!

10分で、といいながらたぶん mod_perl と Apache2 をビルドするのに 10 分以上かかるという罠。まあいいや。以下のやり方で LinuxMacOSX どちらでもちゃんと動くと思われます。

まず、mod_perl 2.0 のインストール。DSO でもいいけど、ここでは Apache にスタティックに組み込みます。

  • インストールディレクトリは /usr/local/httpd_mp2 に。
  • MPM は prefork。perl を thread 有効でビルドしてるなら mpm=worker でもいいと思います。
$ wget http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
$ wget http://www.apache.org/dist/httpd/httpd-2.0.55.tar.gz
$ tar zxvf mod_perl-2.0-current.tar.gz
$ tar zxvf httpd-2.0.55.tar.gz
$ cd mod_perl-2.0.2
$ perl Makefile.PL ?
MP_USE_STATIC=1 ?
MP_AP_PREFIX=../httpd-2.0.55 ?
MP_AP_CONFIGURE="--prefix=/usr/local/httpd_mp2 --with-mpm=prefork"
$ make
$ make test
$ sudo make install

mod_perlApacheコンパイルは一緒にやってくれるので、mod_perl、ウェブサーバー共にインストールはこれで完了。*1

次に、Apache の設定。highperformance.conf をコピーして書き換えます。

$ cd /usr/local/httpd_mp2/conf
$ sudo cp httpd.conf httpd.conf.default
$ sudo cp highperformance.conf httpd.conf
$ sudo vi httpd.conf

内容の方は、こんな感じで。

Listen 80
ServerRoot /usr/local/httpd_mp2
DocumentRoot /usr/local/httpd_mp2/htdocs

User  nobody
Group nobody

MaxClients       150
StartServers     5
MinSpareServers  5
MaxSpareServers  10
MaxRequestsPerChild 100
ErrorLog logs/error_log
TransferLog logs/access_log
HostnameLookups Off

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

次に、mod_perl の設定を追記します。

  • localhost の 80 番にアクセスしたら Sandbox::Hello ハンドラが動くように。
  • startup.pl の置き場所は適当に。
NameVirtualHost *:80
<VirtualHost *:80>
    ServerName powerbook.bloghackers.net:80

    PerlModule mod_perl2
    PerlRequire /Users/naoya/perlhacks/Apache2/startup.pl
    PerlModule Sandbox::Hello
    <Location />
        SetHandler perl-script
        PerlResponseHandler Sandbox::Hello
    </Location>
</VirtualHost>

conf で指定した場所に startup.pl を作ります。中では、とりあえずライブラリパスの設定をするだけ。アプリケーションが大きくなるにつれてこのファイルも育っていくことでしょう。

#!/usr/local/bin/perl
use strict;
use warnings;
use lib qw (/Users/naoya/perlhacks/Apache2/lib);

1;

startup.pl で指定した lib ディレクトリの中に Sandbox/Hello.pm を作って、Hello, World! なコードを書く。

package Sandbox::Hello;
use strict;
use warnings;
use Apache2::RequestRec;
use Apache2::RequestIO;
use Apache2::Const -compile => 'OK';

sub handler : method {
    my ($class, $r) = @_;
    $r->content_type('text/plain');
    $r->print('Hello, World');
    return Apache2::Const::OK;
}

1;

これで apachectl start して Apache を立ち上げる。http://localhost/ にアクセスして Hello, World! が出力されれば完了です。

Apache2::Request を使いたくなったら

$ sudo perl -MCPAN -e shell
cpan> install ExtUtils::XSBuilder
cpan> look Apache2::Request
# perl Makefile.PL --with-apache2-apxs=/usr/local/httpd_mp2/bin/apxs
# make
# make test
# make install

という感じでインストールして、httpd.conf に

LoadModule apreq_module modules/mod_apreq2.so

を追加します。

これで、

...
use Apache2::Reqeust;
...

sub handler : method {
    my ($class, $r) = @_;
    my $apr = Apache2::Request->new($r);
    my $mode = $apr->param('mode');
    ...
}

という具合にクエリパラメータが拾えるようになります。

Enjoy!

*1:バックスラッシュが ? になっちゃってます。読み替えてね。