155 Views
February 24, 24
スライド概要
2011/12/10 に Hokkaido.pm#6 で発表したスライドです。
I like 🚌 and ☕
mod_perl hacks PHP 株式会社fonfun 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2011/12/10
自己紹介
自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • 出身は北海道河東郡音更町(帯広市の隣) • 大学で上京して現在は東京の会社に勤務
自己紹介 • Hokkaido.pm#5で「mod_perl温故知新」 というトークを人生初披露 • 公の場でのトークは今回で3回目 • モダンPerlに乗れていない30代 • 趣味: クラシック音楽、カフェ散策、 路線バス
所属紹介 • 株式会社fonfun(フォンファン) http://www.fonfun.co.jp/ • 主力製品:リモートメール http://rmail.jp/ • 任意団体g15アソシエーション http://g15.jp/
所属紹介 • 株式会社fonfun(旧社名:ネットビレッジ) • 1999年からウェブメール (商品名:リモートメール)を運用 • 2003年に第4世代システム(Perl + Apache/ mod_perl + Oracle + Post x)を開発 fi • 最近新しい技術的な試みにチャレンジ中
Hokkaido.pm++ • 北海道は(本当に)私の故郷です! • 初スピーカーの機会を与えていただいて ありがとうございます!
Agenda
Agenda • mod_perl振り返り • PHP振り返り • mod_perl Hacks PHP • Authen/Authz Hacks • Output Filter Hacks
Agenda • 前回、訳分からず盛り込みすぎたので • 20分でスライド90枚作った→無理 • 今回は軽く行きます • 「mod_perlとかオワコン」発言禁止
mod_perl振り返り
mod_perl振り返り • mod_perlはPerl CGIの高速化もできる • mod_perlの真髄はApacheモジュールで 出来る様々なことをPerlで書けること • 前回(#5)発表した「mod_perl温故知新」 Slideshareで公開しています
mod_perl振り返り • 今回はmod_perl2のみのお話 • mod_perl1(Apache1.x)ではネイティブの フィルタ関連がまだ登場前なので… • 今回はフィルタ関連のお話もします
PHP振り返り
PHP振り返り http://ja.wikipedia.org/wiki/PHP:_Hypertext_Preprocessor
PHP振り返り • IT業界では基本的な話 • 私達はPerl Monger!! ここはHokkaido.pm!! • PHP製ソフトを使うのは構わないけど、 中身をいじるまでは余りしたくない
PHPあるある? • 発注したウェブアプリがPHP製で、既に 誰かが勝手に納品しちゃっている • 蓋を開けると実装とかがテキトウ過ぎ • で、Perl Mongerの俺が修正すんの? • PHPデバッグとかマジ勘(ry
PHPあるある? • ※今のお話はフィクションです(たぶん)
PHPあるある? • ※大人の世界の詮索はお控えください
大切な事なので • PHPという言語をdisってる訳ではない • 良いソフトウェアもたくさんあります
PHP製の良質ソフト その他いろいろ!
本題へ • PHPの宣伝は置いといて… • PHPになるべく手を加えず、機能を追加 したりするにはどうすればいいか • できればPerlで出来れば嬉しい • そこで…
mod_perl hacks PHP
mod_perl hacks PHP • PHPが実行される前後にmod_perlで何か フックを差し込めないか • PHP処理前に認証・許可処理 • PHP処理後に出力をフィルタ…等々
処理フェーズ:mod_perl2 PerlChildInitHandler PerlPostReadRequestHandler PerlInitHandler PerlTransHandler PerlMapToStorageHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlFixupHandler PerlResponseHandler PerlLogHandler PerlCleanupHandler PerlChildExitHandler ※Apache2に元々対応するフェーズがあります / ※結構省略があります。以下を参照 fi fi http://perl.apache.org/docs/2.0/user/con g/con g.html
Apache2 / mod_perl2 処理フェーズ ※「Practical mod_perl」より抜粋
Apache2 / mod_perl2 処理フェーズ
ここで疑問 • Q: PHPはPerlResponseHandlerが対 応するApache2レスポンスフェーズ以外 で何か巧妙なことをしていないのか • A:していない (しないのがポリシー) • PHPコアの開発者の誰かが言っていた らしい ※ソース見つけられなくてすみません
それでは本題へ… • この話は他のApache上で動作するLLや プログラムでも通用するかも…でも… • Tomcatのコネクタとか謎だらけ • FastCGI / mod_{他の言語} も • なので今回はPHPに限ったお話に
Authen/Authz Hacks
Authen/Authz Hacks • PHPの認証がマズいケース • php.iniの設定がマズい • PHPのsession_start()等の一連のセッ ション関連関数の使い方がマズい • 何もマズくなくても既存の認証がある
Authen/Authz Hacks • php.iniやsession_*()関数の諸々の処理を デバッグするくらいなら… • 既に他サイトでPerlで作った既存の認証 付きサイトがあるなら… • →PHP側のセッション管理を捨てて、 シングルサインオン(SSO)も可能に
Cookieの読み書き
Cookieの読み書き • sub handler { my $r = shift; ... } 説明は省略 • Raw Cookie を読み書きするモジュール は HTTP::Cookies 等いろいろあります • Apache2 (libapreq) にも Apache2::Cookie や APR::Request::Cookie 等のモジュール もあり
AAA • アクセスコントロール・認証・許可 • 3つのディレクティブ • PerlAccessHandler • PerlAuthenHandler • PerlAuthzHandler
CPAN Module of Apache2::AuthCookie*
CPAN Module of Apache2::AuthCookie* • Apache2::AuthCookie は今もなお精力的 にメンテナンスされている • 今回Apache2::AuthCookie でデモを作っ てみようと思ったが間に合わなかった • すみません
Output Filter Hacks
Output Filter Hacks • PHPの出力の書き換え • Apacheのネイティブフィルタなので、 PHPのob_*系設定等は一切関係無し
Output Filter Hacks • 考えられる用途: • PHPで書ききれない処理を独自マーク アップの形にしておいてPerlで置換 • i-mode絵文字のSoftbank向け変換 (Perlの絵文字変換技術は豊富で高速)
Output Filterの書き方 • Filter の場合 sub handler { ... } は $r (Request Object)ではなく、 $f (Filter Object) を第一引数に受け取る • PerlOutputFilterHandler ディレクティブ
Output Filterの書き方 <VirtualHost *:80> <FilesMatch “.*(html?|php)$”> PerlOutputFilterHandler \ MyApache2::FilterObfuscate </FilesMatch> </VirtualHost>
Output Filterの書き方
DEMO
Filterあれこれ • パフォーマンスは二の次として、pipe的 な処理で良いならApache2.1からの標準 モジュールmod_ lterがあります • 言語は問わない、というか ”*.html” を pipeでw3mに渡してtext/plainに整形して fi 返す等の芸当もできます
Filterあれこれ
まとめ
まとめ • Apache上のPHPであれば、処理の前後に mod_perlで処理を挟むことができる • PHPはレスポンスフェーズ以外では控え 目なので、mod_perlを思う存分使える
最後に
最後に • Webにmod_perlの情報は本当に少ない • mod_perl2ともなると壊滅的 • APR:: Apache2:: ModPerl:: まわり • 他のLLより歴史の古いPerl固有の問題?
日本Perl改造計画 • 「日本Perl改造計画」というレガシー 時代が長かったPerlの情報源を刷新して いく試みがあるようです
日本Perl改造計画 http://d.hatena.ne.jp/syohex/20111110/1320938963
日本Perl改造計画 • WAF全盛期でもApacheは健在 • 今回のようなシチュエーションもある • いざという時のためのmod_perl情報を 提供したい
日本Perl改造計画 • 「日本mod_perl改造計画」をしたい • 日本語でmod_perl(1 and 2)の情報を発信 していくポータルサイト作成を計画中 • トークで話せない分量のネタも公開 • 試みはブログやTwitterで報告します
参考文献 • mod_perl2 User’s Guide (Onyx Neon 2007; http://modperl2book.org/)
ご清聴 ありがとうございました