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(); ?>
※正常にインストールが完了していればこのファイルにアクセスする事で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