2004-09-18
@ [music] SLIPKNOT来日
10/31の方に行こうかな〜と思ってます。もう解散してしまいそうだし。チケット取れるかな〜。
2005-09-18
@ [perl] Apache2 + mod_perl2.0.1 + Sledge-1.11
今週頭からずっとインストールにてこずっていたのですが、昨日朝方までかけてなんとかHello world!を出すところまでたどり着きました。
環境はDebian sarge + Apache 2.0.54です。Apacheはdebからインストールしている状態です。perlとmod_perlとlibapreqとSledgeはここで野良ビルドしてインストールします。
まずはperlのインストールから。http://cpan.org/src/README.htmlよりstableである5.8.7をダウンロードして解凍します。
$ tar xvzf stable.tar.gz $ cd perl-5.8.7 $ sh Configure -Dusethreads -Duselargefiles \ -Duse_ithreads -Dprefix=/usr/local -des $ make $ make test # make install
これで/usr/local/配下にperlがインストールされました。もし/usr/local/binにパスが通っていない場合はパスを通しておきます。んで
$ perl -v
してバージョンを確認しましょう。
続いてはlibapreq2のインストールです。ここから最新版(今回は2.06-dev)を取得してインストールします。
$ tar xvzf libapreq2-2.06-dev.tar.gz $ cd libapreq2-2.06-dev $ ./configure --prefix=/usr/local --with-apache2-apxs=/usr/bin/apxs2 \ --with-perl-opts $ make $ make test (ここでエラーとなりますがとりあえず無視します) # make install # cp -f module/apache2/.libs/mod_apreq2.so /usr/lib/apache2/modules/
これで/usr/lib/apache2/modules配下にmod_apreq2.soがインストールされます。今度は必要なPerlモジュールをインストールします。
$ cd glue/perl # perl -MCPAN -e 'install ExtUtils::XSBuilder::ParseSource' (ビルドに必要なモジュールをインストール) $ perl Makefile.PL $ make # make install
次はmod_perl2のインストールです。
perl.apache.orgより2.0系の最新版(今回は2.0.1)を取得して解凍します。
$ tar xvzf mod_perl-2.0-current.tar.gz $ cd mod_perl-2.0.1
あとはMakefileを作るのですが、この時にapxs2コマンドのパスを指示します。そしてmake && make install。
$ perl Makefile.PL MP_APXS=/usr/bin/apxs2 $ make $ make test (ここでもいくつかテストが失敗しますが無視します) # make install # cp -f src/modules/perl/mod_perl.so /usr/lib/apache2/modules/
ここでひとまず、インストールしたmod_perl2の動作確認を行ってみます。下記の内容をhttpd.confに追記してApacheを再起動します。これで拡張子が.plなファイルはmod_perl2で動作するようになります。
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so LoadModule apreq_module /usr/lib/apache2/modules/mod_apreq2.so <Files *.pl> SetHandler perl-script PerlHandler ModPerl::Registry Options +ExecCGI PerlSendHeader On Order allow,deny Allow from all </Files>
# /etc/init.d/apache2 restart
そして下記の環境変数を出力するスクリプトを作成し、ドキュメントルートなどの下においてブラウザからアクセスしてみましょう。見事環境変数が出力されればmod_perl2のインストールは完了です。
#!/usr/local/bin/perl -w
use strict;
print "Content-type: text/plain\n\n";
foreach my $key (keys(%ENV)) {
print "$key = $ENV{$key}\n";
}
残すところはSledgeのインストールなのですが、Sledgeが使用するDBIとDBD::mysqlを先にインストールしておきます。
# perl -MCPAN -e 'install Bundle::DBI' # perl -MCPAN -e 'install DBD::mysql'
では最後の難関、Sledgeのインストールに移ります。ダウンロードページから最新版(今回は1.11)を取得して解凍し、付属のcpan_install.plを実行します。
$ tar xvzf Sledge-1.11.tar.gz $ cd Sledge-1.11 # perl eg/cpan_install.pl
するとCPANモジュールのコンフィギュレーションが始まるので質問に対して適当に答えていきます(ほぼ全てデフォルトでOKでした)。その後、Sledgeに必要なモジュールのインストールが対話式で始まるので、全てデフォルト通りに答えます。これが終わるとSledgeに必要なモジュールのほぼ全てがインストールされます。いくつか、なぜかcpan_install.plでもインストールできないモジュールがあるので、残りは
$ perl Makefile.PL
とやると
Warning: prerequisite Apache::Request 0 not found. Warning: prerequisite Class::Fields 0 not found. Warning: prerequisite Test::Inline 0 not found.
というように足りないモジュールを教えてくれるので、これはCPANから取ってきて手動でインストールします。ただし、Apache::Requestは今回はlibapreq2を使うのでインストールする必要はありません。
あとは先ほどのようにMakefileを作成してmake && make installします。
$ perl Makefile.PL $ make # make install
ここで/usr/local/lib/perl5/site_perl/5.8.7配下にSledgeがインストールされるのですが、このままではmod_perl2に対応していないので動きません。というわけでこちらを参考にmod_perl2に対応させてみます。
- Sledge/Pages/Compat.pm
-
既存のCompat.pmを下記の内容で置き換えます。
package Sledge::Pages::Compat; # $Id: Compat.pm,v 1.1.1.1 2003/02/13 06:59:36 miyagawa Exp $ # # Tatsuhiko Miyagawa <miyagawa@edge.co.jp> # Livin' On The EDGE, Co., Ltd.. # use strict; use mod_perl; use constant MOD_PERL2 => (defined $ENV{MOD_PERL} && $mod_perl::VERSION > 1.99); use constant MOD_PERL1 => (defined $ENV{MOD_PERL} && !MOD_PERL2); sub import { my $base = MOD_PERL1 ? 'Sledge::Pages::Apache' : MOD_PERL2 ? 'Sledge::Pages::Apache2::MP20' : 'Sledge::Pages::CGI'; eval qq{require $base}; { my $pkg = caller; no strict 'refs'; unshift @{"$pkg\::ISA"}, $base; } } 1; - Sledge/Pages/Apache2/MP20.pm
-
新規に作成します。
package Sledge::Pages::Apache2::MP20; use strict; use base qw/Sledge::Pages::Base/; use Apache2::RequestUtil; use Sledge::Request::Apache2::MP20; sub create_request { my($self, $r) = @_; my $req = Sledge::Request::Apache2::MP20->new($r || Apache2::RequestUtil->request ); return $req; } 1; - Sledge/Request/Apache2/MP20
-
これも新規に作成します。
package Sledge::Request::Apache2::MP20; use Apache2::Request; use Apache2::Upload; use Apache2::Const -compile => qw(:common); our @ISA = qw(Apache2::Request); sub new { my($class, $r, @args) = @_; my $self = bless { r => Apache2::Request->new($r, @args), _my_table => '', }, $class; my %table; for my $key ($self->{r}->param) { my @ret = $self->{r}->param($key); $table{$key} = scalar @ret > 1 ? [@ret] : $ret[0]; } $self->{_my_table} = \%table; return $self; } sub param { my $self = shift; my($key, $val) = @_; my $table = $self->{_my_table}; unless(defined $key) { return keys %{$table}; } if(defined $val){ $table->{$key} = $val; $self->{_my_table} = $table; } my $ret = $table->{$key}; if(ref $ret eq 'ARRAY') { return wantarray ? @$ret : $ret->[0]; } else { return $ret; } } sub send_http_header { my $self = shift; my $type = shift; $self->{r}->content_type($type) if($type); } sub header_in { my $self = shift; $self->{r}->headers_in->get($_[0]); } sub header_out { my($self, $key, @v) = @_; if($key eq 'Content-Length'){ $self->{r}->set_content_length(shift @v); }elsif($key =~ /^(?:Set-Cookie|Location)$/){ $self->{r}->err_headers_out->add($key => $_) for @v; }elsif($key ne 'Content-Type'){ $self->{r}->content_type(shift @v); }else{ $self->{r}->headers_out->add( $key => $_ ) for @v; } } 1;
つまるところ、mod_perl2用のRequestクラスとPagesクラスを作成して、それをCompat.pmで使うようにしているわけです。
これで本当に動くのかどうかは、こちらのhelloプロジェクトのサンプルで検証してみてください。ちなみにhttpd.confの設定はここに書かれているままだと動作しないので、私は下記のようにしています。
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so LoadModule apreq_module /usr/lib/apache2/modules/mod_apreq2.so <Files *.cgi> SetHandler perl-script PerlHandler ModPerl::Registry Options +ExecCGI PerlSendHeader On Order allow,deny Allow from all </Files> <Directory htdocsディレクトリ> PerlSetEnv PERL5LIB /home/kazuhiro/public_html/sledge/hello/lib/ </Directory>
私の環境ではいちおうこれでSledge + mod_perl2が無事動いてHello worldが表示されました!
もし間違いやなどあればぜひご指摘下さい。
2005/09/20追記: kurtさんのつっこみを反映しました。
2006/08/23追記: nipotanさんのコメントを受けてSledge::Request::Apache2::MP20->paramのunless ($key) の部分を修正しました。気づくの遅くてスイマセン。
2006-09-18
@ [apache] mod_fcgidをstatic linkしてapache2.2をインストール
mod_fcgidをDSOじゃなくてstatic linkする方法。本家のドキュメントに書いてありますが備忘録がてら一応。
(httpd-2.2.3.tar.gzとmod_fcgid.2.0.tar.gzを解凍) $ cp -R mod_fcgid.2.0 httpd-2.2.3/modules/fcgid $ cd httpd-2.2.3 $ ./buildconf (ここからはhttpd-2.2.3のコンパイル) $ export CFLAGS="-O3" $ ./configure --prefix=/usr/local/mod_fcgid \ --with-program-name=mod_fcgid \ --with-mpm=prefork \ --enable-shared \ --enable-so \ --enable-fcgid \ --disable-asis \ --disable-cgid \ --disable-proxy \ --disable-proxy-connect \ --disable-proxy-http \ --disable-proxy-balancer \ --disable-proxy-ftp \ --disable-proxy-ajp \ --disable-userdir \ --enable-modules='cgi' \ --enable-mods-shared='rewrite include host-alias' $ make # make install
んでインストールが完了したら、static linkされているか確認してみます。
$ /usr/local/mod_fcgid/bin/mod_fcgid -l |grep mod_fcgid mod_fcgid.c
あとは適当にmod_fcgid.conf(httpd.conf)をでっちあげればOKです(下記はrailsアプリ用の設定)。
AddHandler fcgid-script .fcgi SocketPath /dev/shm/mod_fcgid DefaultInitEnv RAILS_ENV production IPCConnectTimeout 5 IPCCommTimeout 60
2006/11/12追記: mod_fcgiのバージョンを2.0にしました。また、--enable-mods-shared='rewrite include host-alias'の部分から、actionを削除しました(しかも本当はactionsというモジュールでした...)
# kurt [sledgeとmod_perl2でここに行き着きました!動きましたよ! なのですが、Sledge::Dispatch..]
# kurt [追記で $self->{_my_table} = \%table; これでHoge::Pages::Index(..]
# おいぬめ [ご指摘ありがとうございます。 日記の整形時に $self->{_my_table} = %table; となってし..]