apache1.3にmod_perl+mod_php5を静的に組み込む

はじめに

いまさらapache+mod_perlの記事なんですが・・・

共有モジュールとしてapacheに組み込む記事は良く見かけますがスタティックに組み込むのはあまり見かけないので保存用にと思いentryしときます

実際問題あのplackが登場してからmod_perlは一切使わなくなっております・・

組み合わせ例

以下の組み合わせで成功(mod_perl1.31だとhttpd起動時SEGVする)

  • FreeBSD-8.1
  • perl-5.8.9
  • php-5.3.3
  • libapreq-1.34
  • mod_perl-1.30
  • mod_php5
  • apache-1.3.42

mod_perlの依存の関係

libwww-perlモジュールも必須のためcpanmなどを使ってBundle::LWPをインストールする

$ cpanm Bundle::LWP

1.apache1.3.42を解凍しておく

http://httpd.apache.org/download.cgi#apache13

$ tar zxvf apache_1.3.42.tar.gz

2.phpのインストール(mod_phpもこの中に含まれています)

http://jp2.php.net/get/php-5.3.3.tar.gz/from/a/mirror

$ cd php-5.3.3
$ ./configure --with-mysql --with-apache=../apache_1.3.42
$ make
$ make test
$ sudo make install
$ sudo cp php.ini-development /usr/local/lib/php.ini

2.mod_perlのインストール

http://search.cpan.org/~gozer/mod_perl-1.30/

mod_proxyも必要なのでlibproxyをここで指定する ※後で他のモジュールを動的にロードする予定がある場合には最後の--enable-module=soを追加して下さい

$ cd ../mod_perl-1.30
$ perl Makefile.PL APACHE_SRC=../apache_1.3.42/src EVERYTHING=1 USE_APACI=1 DO_HTTPD=1 APACHE_PREFIX=/usr/local/apache APACI_ARGS='--activate-module=src/modules/php5/libphp5.a --activate-module=src/modules/proxy/libproxy.a --prefix=/usr/local/apache --enable-module=so'

$ make
$ sudo make install

最後のmake installでmod_perlの後にapacheも自動的にインストールされます

3.静的に組み込まれているモジュールの確認

$/usr/local/apache/bin/httpd -l
Compiled-in modules:
  http_core.c
  mod_env.c
  mod_log_config.c
  mod_mime.c
  mod_negotiation.c
  mod_status.c
  mod_include.c
  mod_autoindex.c
  mod_dir.c
  mod_cgi.c
  mod_asis.c
  mod_imap.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_access.c
  mod_auth.c
  mod_proxy.c
  mod_setenvif.c
  mod_perl.c
  mod_php5.c
  mod_proxy.c
suexec: disabled; invalid wrapper /usr/local/apache/bin/suexec

※mod_perl.c, mod_php5.c が含まれておりhttpd本体に内蔵されているのが分かります

4.libapreq Apache Request C Library

http://search.cpan.org/~isaac/libapreq-1.34/

mod_perlで利用するCで書かれたapache requestモジュールです

perl Makefile.PL -httpd /usr/local/apache/bin/httpd
make
make install

5.php拡張子の関連付け

apacheが.phpファイルをphpと認識するようにする

/usr/local/apache/conf/srm.conf

以下の行を追加

AddType application/x-httpd-php .php

6.apache起動

/usr/local/apache/bin/apachectl start

ログにmod_perlとmod_phpの文字が見えたら成功です

[Tue Oct 12 01:46:39 2010] [notice] Apache/1.3.42 (Unix) PHP/5.3.3 mod_perl/1.30 configured -- resuming normal operations

7.mod_phpのテスト

phpinfo apacheが読める位置に次のファイルを設置

info.php

<?php
phpinfo();
?>

phpinfo

※正常にインストールが完了していればこのファイルにアクセスする事でphpに関する各種情報が表示されます

8.mod_perlで利用するstartup.plの設置

apache起動時に1回だけ実行されるプログラムですここにはあらかじめloadしておきたいモジュールを書いたりしますここでloadされたモジュールはapacheの親プロセスと子プロセス間でメモリが共有されますよく使うモジュールをロードしておくことで使用メモリの節約に繋がります

/usr/local/apache/perl/startup.pl

#!/usr/bin/perl

use strict;
use warnings;

# your favorite module load
# use DBIx::Class;
# use Template;
# use Moose;
# use Catalyst;
# use ......

BEGIN {
    use Apache;
    use lib qw (/usr/local/apache/perl/lib);
}

1;

apache起動時にstartup.plを起動できるように以下を追加

/usr/local/apache/conf/httpd.conf

PerlRequire /usr/local/apache/perl/startup.pl
PerlFreshRestart On

9.mod_perlサンプルプログラム

Helloパッケージ

mod_perlハンドラーで書かれたHello mod_perl!を出力するだけのプログラム

/usr/local/apache/perl/lib/Hello.pm

package Hello;

use strict;
use warnings;
use Apache::Request;
use Apache::Constants qw(:common);

sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    $r->print("Hello mod_perl!");
    return OK;
}
1;

10.apacheでHelloパッケージを動かすmod_perl設定

Locationディレクティブで設定されたエンドポイント/helloにアクセスがあると Helloパッケージにあるhandlerメソッドを実行します

/usr/local/apache/conf/httpd.conf

PerlModule Hello

    <location /hello>
        SetHandler  perl-script
        Perlhandler Hello
        PerlSendHeader On
    </location>

参考

http://perl.apache.org/docs/1.0/guide/getwet.html

created:

Back to top