Upload
ngi-group
View
2.463
Download
3
Embed Size (px)
DESCRIPTION
フラクタリスト技術知識共有会 2009-09-03 プレゼン資料
Citation preview
Copyright 2009 Fractalist inc. All rights reserved.
1
mod_perl で簡単 Apache モジュール開
発Takayuki Hirayama
Copyright 2009 Fractalist inc. All rights reserved.
2
mod_perl って何者?よくある誤解
CGIの高速なやつ×Apacheに組み込んだ Perlインタープリタ(例: PHP)×
Apache の API に Perl でアクセスできるようにし、Apache のモジュール(プラグイン)を
Perl で開発できるようにするもの
Copyright 2009 Fractalist inc. All rights reserved.
3
mod_perl の要素mod_perl と mod_perl2 がある
mod_perl : Apache1.3系用mod_perl2 : Apache2.x系用
Apache から見た mod_perl ハンドラ( mod_perl2 )mod_perlハンドラ完全にApacheモジュールとして開発する
パラメータなどは全てAPIを通じて取得する高速
cgi-scriptハンドラプログラム側からCGI風にパラメータ取得できる
%ENVパラメータにパラメータ格納printで出力
開発環境ではCGIとして開発できるので開発しやすいModPerl::Registry レスポンスハンドラでCGIとして書かれたプログラムを動かせる
ただしグローバル変数などの挙動に制約あり
Copyright 2009 Fractalist inc. All rights reserved.
4
httpd.confmod_perl ハンドラ
cgi-script ハンドラ + ModPerl::RegistryLoadModule perl_module modules/mod_perl.so
<Location “/index.cgi”> # perl-scriptセットハンドラを指定して、 # PerlResponseHandlerに ModPer::Registryを指定する SetHandler perl-script PerlResponseHandler ModPerl::Registry</Location>
LoadModule perl_module modules/mod_perl.so
# MyApp::Apache2::HelloWorldモジュールにハンドラを実装する
# /somewhere/perl/lib 以下に .pmファイルを置くPerlSwitches -I/somewhere/perl/lib
# 事前ロードPerlModule MyApp::Apache2::HelloWorld
# 特定ロケーションにハンドラを設定<Location /index> SetHandler modperl PerlResponseHandler MyApp::Apache2::HelloWorld</Location>
Copyright 2009 Fractalist inc. All rights reserved.
5
Apache2 の HTTP リクエストライフサイクル
※ http://perl.apache.org/docs/2.0/user/handlers/http.html より引用
デフォルトのハンドラを「上書きする」ハンドラをモジュールとして提供する
Copyright 2009 Fractalist inc. All rights reserved.
6
何が作れるの?レスポンスハンドラ( PerlResponseHandler )パラメータに応じたレスポンス(通常のWebアプリケーション)
プロトコルハンドラカスタム認証ハンドラ(PerlAuthzHandler)カスタムログ出力(PerlLogHandler)
Input/Output Filter ハンドラ全てのリクエストに対し一定の処理をかける(PerlInputFilterHandler)全てのレスポンスに対し事後的に一定の処理をかける(PerlOutputFilterHandler)
Copyright 2009 Fractalist inc. All rights reserved.
7
ソースはどんな感じ?#file:/somewhere/perl/lib/MyApp/Apache2/HelloWorld.pm#----------------------package MyApp::Apache2::HelloWorld;
use strict;use warnings;
use Apache2::RequestRec ();use Apache2::RequestIO ();
# 定数の宣言use Apache2::Const -compile => qw(OK);
# ハンドラメソッドの宣言# これだけ!sub handler { my $r = shift; # Apache2::RequestRec Objectが引数に入ってくる
$r->content_type(‘text/plain’); # HTTPヘッダの格納 $r->print( “Hello World!\n” ); # 出力結果の格納
return Apache2::Const::OK;}1;
クラスメソッドとして定義することもできる継承などが利用できるので開発効率大
開発用のオートリロードも可能
Copyright 2009 Fractalist inc. All rights reserved.
8
特徴1:高速+軽快!Apache起動時に実行イメージをロードする
PHPでは基本的にインタプリタのみロード必要最小限のモジュールのみ使用するようにできるので、実行イメージが小さくなる必ずしも大きなWAFに頼る必要はないRuby on Railsや CakePHPでは原則オールインワンで利用せざるを得ない
ハンドラだけ定義できるので場合によっては限定的な影響範囲にのみ適用できる
Copyright 2009 Fractalist inc. All rights reserved.
9
特徴2:高い開発効率C 言語でなく Perl で記述できるリソースの垣根が低い枯れた技術/モジュール等資産の再活用多彩なCPANモジュールを利用できる
CGIURIEncodeLog::Log4perlHTTP::MobileAgentetc…
ミドルウェアとの連携も容易memcachedDBI
10
特徴3:変数ライフサイクルApache親プロセスと子プロセスでファイルロードタイミングなどを意識できる
Copyright 2009 Fractalist inc. All rights reserved.
Apache親プロセスApache親プロセス
Apache子プロセスApache子プロセス
Apache子プロセスApache子プロセス
Apache子プロセスApache子プロセス
Apache子プロセスApache子プロセス
Apache子プロセスApache子プロセス
リクエスト
レスポンスfork(2)
Apacheの preforkモデルのイメージ
Copyright 2009 Fractalist inc. All rights reserved.
11
まとめ利用シチュエーション広告配信カスタムログ収集その他小さいアプリケーションを短期間で開発したい場合
まとめ
Webアプリケーションの開発要件に応じて様々な形態から採用検討することが重要