俺だけのために Ore! Tips!

Apache2 に mod_perl をインストール

2006年 1月 5日 作業


それなりのアクセスのある「Perl プログラム」で構成された Web サイトを作成したいので、今回、mod_perl を導入してみることにした。

まず、Apache が DSO (Dynamic Shared Object)対応で make されていれば、Apache の再 make は必要無いので調べてみる。

websrv# /usr/local/apache2/bin/httpd -l|grep mod_so
  mod_so.c

うむ。ちゃんと DSO (Dynamic Shared Object)対応になってますな。

まあ、自分で apache を make する時は、enable-modules=so オプションは必ず付けて configure するので、必ず DSO 対応になってるんだけどね。

そもそも、Apache2 で enable-modules=so オプションが必要なのかどうかは調べてないので知らないのだが、まあ、「足りない」よりは「余計」な処理の方が良いわけで。:-)

CPAN 検索サイトから mod_ssl を検索してソースを落とすなり。
今回は、http://search.cpan.org/CPAN/authors/id/P/PG/PGOLLUCCI/mod_perl-2.0.2.tar.gz から落とした。

websrv# cd /usr/local/src
websrv# lynx http://search.cpan.org/~pgollucci/mod_perl-2.0.2/
<略>
websrv# ls -la mod_perl*
-rw-r--r-- 1 root admin 3692744 Jan 5 17:39 mod_perl-2.0.2.tar.gz
websrv# tar xvfz mod_perl-2.0.2.tar.gz
mod_perl-2.0.2
mod_perl-2.0.2/t
mod_perl-2.0.2/xs
<略>
mod_perl-2.0.2/t/response/TestAPI/in_out_filters.pm
mod_perl-2.0.2/t/response/TestAPI/module.pm
mod_perl-2.0.2/t/response/TestAPI/slurp_filename.pm
websrv# cd mod_perl-2.0.2


さて、インストールの方法は INSTALL ドキュメントを見れば載ってるので、このとおりにすればええだけですよ。

Simple install:

  % perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs
  % make && make test
  % make install

Simple config:

  LoadModule perl_module modules/mod_perl.so
  #PerlModule Apache::compat
  # your config comes here

For a more detailed version (including more options) refer to:

  docs/user/intro/start_fast.pod

<以下略>

なので、

websrv# find / -name "apxs*" -print
<略>
/usr/local/src/httpd-2.0.54/support/apxs
/usr/local/apache2/bin/apxs
/usr/local/apache2/man/man8/apxs.8
websrv# perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs
Reading Makefile.PL args from @ARGV
   MP_APXS = /usr/local/apache2/bin/apxs
no conflicting prior mod_perl version found - good.
Configuring Apache/2.0.54 mod_perl2/2.0.2 Perl/v5.6.1
Checking if your kit is complete...
Looks good
'NO_META' is not a known MakeMaker parameter name.
[   info] generating script t/TEST
[   info] generating script ./t/cgi-bin/cookies.pl
Warning: prerequisite Cwd 2.06 not found at /usr/local/lib/perl5/5.6.1/ExtUtils/MakeMaker.pm line 343
.
Writing Makefile for Apache::Test
Checking for File::Spec...ok
Checking for Cwd... found v2.04
[  error]
The following Apache-Test dependencies aren't satisfied:
[  error]       Cwd: 2.06
[  error] Install those from http://search.cpan.org and try again


ありゃりゃ?
Cwd とかいうモジュールが古いの? 今が 2.04 だから 2.06 にせえと言うてるんだろうなあ。

websrv# perl -MCPAN -e shell

cpan shell -- CPAN exploration and modules installation (v1.76)
ReadLine support enabled

cpan> install Cwd
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
  ftp://ftp.dti.ad.jp/pub/lang/CPAN/authors/01mailrc.txt.gz
Going to read /root/.cpan/sources/authors/01mailrc.txt.gz
CPAN: Compress::Zlib loaded ok
Fetching with LWP:
<略>
Installing /usr/local/lib/perl5/5.6.1/man/man3/File::Spec::Functions.3
Writing /usr/local/lib/perl5/5.6.1/mach/auto/Cwd/.packlist
FreeBSD: Registering installation in the package database
Appending installation info to /usr/local/lib/perl5/5.6.1/mach/perllocal.pod
  /usr/bin/make install  -- OK

cpan> exit
No history written (no histfile specified).
Lockfile removed.

websrv# perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs
Reading Makefile.PL args from @ARGV
   MP_APXS = /usr/local/apache2/bin/apxs
no conflicting prior mod_perl version found - good.
Configuring Apache/2.0.54 mod_perl2/2.0.2 Perl/v5.6.1
<略>
[warning] Check the results of
[warning]
[warning]   $ /usr/local/apache2/bin/apxs -q LIBEXECDIR
[warning]
[warning] and adjust the LoadModule directive accordingly.

なんかワーニングが出てるけど、とりあえず終了した様子・・・

websrv# make
cd "src/modules/perl" && make
<略>
cp bin/mp2bug blib/script/mp2bug
/usr/local/bin/perl -I/usr/local/lib/perl5/5.6.1/mach -I/usr/local/lib/perl5/5.6.1/BSDPAN -MExtUtils::MakeMaker -e "MY->fixin(shift)" blib/script/mp2bug
Manifying blib/man3/Apache2::Build.3
Manifying blib/man3/ModPerl::CScan.3
Manifying blib/man3/ModPerl::Code.3
Manifying blib/man3/mod_perl2.3
Manifying blib/man3/Bundle::Apache2.3
websrv# make test
cd "src/modules/perl" && make
<略>
server localhost.netandfield.com:8561 listening (TestHooks::push_handlers_anon)

still waiting for server to warm up: ...........................................
............................................................................
the server is down, giving up after 122 secs
[ error] failed to start server! (please examine t/logs/error_log)
+--------------------------------------------------------+
| Please file a bug report: http://perl.apache.org/bugs/ |
+--------------------------------------------------------+
*** Error code 1

Stop in /usr/local/src/mod_perl-2.0.2.

あり???エラーになったぞ。サーバとの通信でタイムアウト?何を言うておるんや?
エラーログを見ろというので見てみる。

websrv# ls -la t/logs/error_log
-rw-r--r-- 1 nobody nobody 1506 Jan 5 19:21 t/logs/error_log
websrv# cat t/logs/error_log
[Thu Jan 05 19:21:26 2006] [info] Init: Initializing OpenSSL library
[Thu Jan 05 19:21:26 2006] [info] Init: Seeding PRNG with 0 bytes of entropy
[Thu Jan 05 19:21:26 2006] [info] Init: Generating temporary RSA private keys (512/1024 bits)
<略>
[Thu Jan 05 19:21:32 2006] [info] Server built: May 8 2005 09:42:39
[Thu Jan 05 19:21:32 2006] [debug] prefork.c(956): AcceptMutex: flock (default: flock)

う〜ん、なんか、何度も Apache を起動してるような。
一旦 Apache を stop させてやってみるか・・・

websrv# /usr/local/apache2/bin/apachectl stop
websrv# make test
cd "src/modules/perl" && make
Skip blib/lib/Apache2/Status.pm (unchanged)
Skip blib/lib/ModPerl/FunctionMap.pm (unchanged)
<略>
Failed Test              Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/protocol/pseudo_http.t               13   11  84.62%  2-8 10-13
22 tests skipped.
Failed 1/231 test scripts, 99.57% okay. 11/2191 subtests failed, 99.50% okay.
[warning] server localhost.netandfield.com:8529 shutdown
[ error] error running tests (please examine t/logs/error_log)
+--------------------------------------------------------+
| Please file a bug report: http://perl.apache.org/bugs/ |
+--------------------------------------------------------+
*** Error code 1

Stop in /usr/local/src/mod_perl-2.0.2.
websrv# /usr/local/apache2/bin/apachectl start


どうも、Apache は止めて make test をしないと駄目なようである。
そしたら test が始まった。(まじっすか?テストに数分かかるんじゃけど、止めっぱなし?本番サーバじゃ出来んな・・・)

・・・が、結局エラー。途中、CGI.pm のバージョンが古いとか出てたので、それを最新にしてみたり、BSD::Resource をインストールしてみたりしたが状況変わらず。

まあ、99.57% okay だし、もう make install しちゃいましょう。

websrv#
websrv# make install
cd "src/modules/perl" && make
/usr/bin/perl -Iblib/lib -I/usr/local/src/mod_perl-2.0.2/Apache-Test/lib -MModPerl::BuildMM -e ModPerl::BuildMM::glue_pod lib/Apache2/Status.pm /usr/local/src/mod_perl-2.0.2/docs/api/Apache2/Status.pod blib/lib/Apache2/Status.pm
<略>
Installing /usr/local/bin/mp2bug
Writing /usr/local/lib/perl5/site_perl/5.6.1/mach/auto/mod_perl2/.packlist
FreeBSD: Registering installation in the package database
FreeBSD: Cannot determine module description
Appending installation info to /usr/local/lib/perl5/5.6.1/mach/perllocal.pod
+--------------------------------------------------------------+
|                                                              |
| For details on getting started with mod_perl 2, see:         |
|                                                              |
|   http://perl.apache.org/docs/2.0/user/intro/start_fast.html |
|                                                              |
|                                                              |
| Found a bug?  File a bug report:                             |
|                                                              |
|   http://perl.apache.org/bugs/                               |
|                                                              |
+--------------------------------------------------------------+



まあ、これでよしとしましょう。
じゃ、Apache の httpd.conf を修正して、Apache の再起動を行います。

websrv# cd /usr/local/apache2/conf
websrv# cp httpd.conf httpd.conf.20060105
websrv# vi httpd.conf

修正内容は↓こんな感じ
(わしの場合は、VirtualHost で設定しているサイト内で使うので、ディレクティブがネストしてますが(^^;)

websrv# diff httpd.conf httpd.conf.20060105
97,100d96
< # 2006/1/5
< LoadModule perl_module  modules/mod_perl.so
< PerlModule Bundle::Apache2
<
472,488d467
<
<     # 2006/01/05
<     <IfModule mod_perl.c>
<
<         Alias /sns/ /usr/local/share/apache/htdocs/sns/
<
<         <Location /sns>
<
<             SetHandler perl-script
<             PerlHandler ModPerl::Registry
<             Options ExecCGI
<             Allow from all
<             PerlSendHeader On
<
<         </Location> <
<     </IfModule>



これで、Apache を再起動。

websrv# /usr/local/apache2/bin/apachectl restart

/usr/local/share/apache/htdocs/sns/ 以下に、

#!/usr/bin/perl

use CGI;

$cgi = new CGI;
print $cgi->header(-type=>'text/html');
print $cgi->start_html(-title=>'Is it running under Mod_perl?',
                       -bgcolor=>'white',
                       -textcolor=>'black',
                       );
print "<H1>It's running <STRONG>";
if (exists $ENV{MOD_PERL}) {
    print "mod_perl!\n";
} else {
    print "CGI!\n";
};
print "</STRONG></H1>\n";

print "<ol>\n";
while (($key, $val) = each %ENV) {
    print "<li> $key : $val\n";
}
print "</ol>\n";

print $cgi->end_html;


という内容のファイルを作成し、chmod 755 して、
http://websrv.netandfield.com/sns/test
にアクセスすると、無事、ブラウザに

It's running mod_perl!
QUERY_STRING :

<以下略>

と表示されてOK!

何とか mod_perl のセットアップ終了であります。


前ページに戻る


Copyright (C) 2005 S.Maaasamasa.