フラクタリスト技術知識共有会発表資料 090903

11
mod_perl で でで Apache ででででででで Takayuki Hirayama 1 Copyright 2009 Fractalist inc. All rights reserved.

Upload: ngi-group

Post on 16-Jan-2015

2.463 views

Category:

Technology


3 download

DESCRIPTION

フラクタリスト技術知識共有会 2009-09-03 プレゼン資料

TRANSCRIPT

Page 1: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

1

mod_perl で簡単 Apache モジュール開

発Takayuki Hirayama

Page 2: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

2

mod_perl って何者?よくある誤解

CGIの高速なやつ×Apacheに組み込んだ Perlインタープリタ(例: PHP)×

Apache の API に Perl でアクセスできるようにし、Apache のモジュール(プラグイン)を

Perl で開発できるようにするもの

Page 3: フラクタリスト技術知識共有会発表資料 090903

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として書かれたプログラムを動かせる

ただしグローバル変数などの挙動に制約あり

Page 4: フラクタリスト技術知識共有会発表資料 090903

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>

Page 5: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

5

Apache2 の HTTP リクエストライフサイクル

※ http://perl.apache.org/docs/2.0/user/handlers/http.html より引用

デフォルトのハンドラを「上書きする」ハンドラをモジュールとして提供する

Page 6: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

6

何が作れるの?レスポンスハンドラ( PerlResponseHandler )パラメータに応じたレスポンス(通常のWebアプリケーション)

プロトコルハンドラカスタム認証ハンドラ(PerlAuthzHandler)カスタムログ出力(PerlLogHandler)

Input/Output Filter ハンドラ全てのリクエストに対し一定の処理をかける(PerlInputFilterHandler)全てのレスポンスに対し事後的に一定の処理をかける(PerlOutputFilterHandler)

Page 7: フラクタリスト技術知識共有会発表資料 090903

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;

クラスメソッドとして定義することもできる継承などが利用できるので開発効率大

開発用のオートリロードも可能

Page 8: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

8

特徴1:高速+軽快!Apache起動時に実行イメージをロードする

PHPでは基本的にインタプリタのみロード必要最小限のモジュールのみ使用するようにできるので、実行イメージが小さくなる必ずしも大きなWAFに頼る必要はないRuby on Railsや CakePHPでは原則オールインワンで利用せざるを得ない

ハンドラだけ定義できるので場合によっては限定的な影響範囲にのみ適用できる

Page 9: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

9

特徴2:高い開発効率C 言語でなく Perl で記述できるリソースの垣根が低い枯れた技術/モジュール等資産の再活用多彩なCPANモジュールを利用できる

CGIURIEncodeLog::Log4perlHTTP::MobileAgentetc…

ミドルウェアとの連携も容易memcachedDBI

Page 10: フラクタリスト技術知識共有会発表資料 090903

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モデルのイメージ

Page 11: フラクタリスト技術知識共有会発表資料 090903

Copyright 2009 Fractalist inc. All rights reserved.

11

まとめ利用シチュエーション広告配信カスタムログ収集その他小さいアプリケーションを短期間で開発したい場合

まとめ

Webアプリケーションの開発要件に応じて様々な形態から採用検討することが重要