mod_perl hacks PHP

155 Views

February 24, 24

スライド概要

2011/12/10 に Hokkaido.pm#6 で発表したスライドです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

mod_perl hacks PHP 株式会社fonfun 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2011/12/10

2.

自己紹介

3.

自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • 出身は北海道河東郡音更町(帯広市の隣) • 大学で上京して現在は東京の会社に勤務

4.

自己紹介 • Hokkaido.pm#5で「mod_perl温故知新」 というトークを人生初披露 • 公の場でのトークは今回で3回目 • モダンPerlに乗れていない30代 • 趣味: クラシック音楽、カフェ散策、 路線バス

5.

所属紹介 • 株式会社fonfun(フォンファン) http://www.fonfun.co.jp/ • 主力製品:リモートメール http://rmail.jp/ • 任意団体g15アソシエーション http://g15.jp/

6.

所属紹介 • 株式会社fonfun(旧社名:ネットビレッジ) • 1999年からウェブメール (商品名:リモートメール)を運用 • 2003年に第4世代システム(Perl + Apache/ mod_perl + Oracle + Post x)を開発 fi • 最近新しい技術的な試みにチャレンジ中

7.

Hokkaido.pm++ • 北海道は(本当に)私の故郷です! • 初スピーカーの機会を与えていただいて ありがとうございます!

8.

Agenda

9.

Agenda • mod_perl振り返り • PHP振り返り • mod_perl Hacks PHP • Authen/Authz Hacks • Output Filter Hacks

10.

Agenda • 前回、訳分からず盛り込みすぎたので • 20分でスライド90枚作った→無理 • 今回は軽く行きます • 「mod_perlとかオワコン」発言禁止

11.

mod_perl振り返り

12.

mod_perl振り返り • mod_perlはPerl CGIの高速化もできる • mod_perlの真髄はApacheモジュールで 出来る様々なことをPerlで書けること • 前回(#5)発表した「mod_perl温故知新」 Slideshareで公開しています

13.

mod_perl振り返り • 今回はmod_perl2のみのお話 • mod_perl1(Apache1.x)ではネイティブの フィルタ関連がまだ登場前なので… • 今回はフィルタ関連のお話もします

14.

PHP振り返り

15.

PHP振り返り http://ja.wikipedia.org/wiki/PHP:_Hypertext_Preprocessor

16.

PHP振り返り • IT業界では基本的な話 • 私達はPerl Monger!! ここはHokkaido.pm!! • PHP製ソフトを使うのは構わないけど、 中身をいじるまでは余りしたくない

17.

PHPあるある? • 発注したウェブアプリがPHP製で、既に 誰かが勝手に納品しちゃっている • 蓋を開けると実装とかがテキトウ過ぎ • で、Perl Mongerの俺が修正すんの? • PHPデバッグとかマジ勘(ry

18.

PHPあるある? • ※今のお話はフィクションです(たぶん)

19.

PHPあるある? • ※大人の世界の詮索はお控えください

20.

大切な事なので • PHPという言語をdisってる訳ではない • 良いソフトウェアもたくさんあります

21.

PHP製の良質ソフト その他いろいろ!

22.

本題へ • PHPの宣伝は置いといて… • PHPになるべく手を加えず、機能を追加 したりするにはどうすればいいか • できればPerlで出来れば嬉しい • そこで…

23.

mod_perl hacks PHP

24.

mod_perl hacks PHP • PHPが実行される前後にmod_perlで何か フックを差し込めないか • PHP処理前に認証・許可処理 • PHP処理後に出力をフィルタ…等々

25.

処理フェーズ: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

26.

Apache2 / mod_perl2 処理フェーズ ※「Practical mod_perl」より抜粋

27.

Apache2 / mod_perl2 処理フェーズ

28.

ここで疑問 • Q: PHPはPerlResponseHandlerが対 応するApache2レスポンスフェーズ以外 で何か巧妙なことをしていないのか • A:していない (しないのがポリシー) • PHPコアの開発者の誰かが言っていた らしい ※ソース見つけられなくてすみません

29.

それでは本題へ… • この話は他のApache上で動作するLLや プログラムでも通用するかも…でも… • Tomcatのコネクタとか謎だらけ • FastCGI / mod_{他の言語} も • なので今回はPHPに限ったお話に

30.

Authen/Authz Hacks

31.

Authen/Authz Hacks • PHPの認証がマズいケース • php.iniの設定がマズい • PHPのsession_start()等の一連のセッ ション関連関数の使い方がマズい • 何もマズくなくても既存の認証がある

32.

Authen/Authz Hacks • php.iniやsession_*()関数の諸々の処理を デバッグするくらいなら… • 既に他サイトでPerlで作った既存の認証 付きサイトがあるなら… • →PHP側のセッション管理を捨てて、 シングルサインオン(SSO)も可能に

33.

Cookieの読み書き

34.

Cookieの読み書き • sub handler { my $r = shift; ... } 説明は省略 • Raw Cookie を読み書きするモジュール は HTTP::Cookies 等いろいろあります • Apache2 (libapreq) にも Apache2::Cookie や APR::Request::Cookie 等のモジュール もあり

35.

AAA • アクセスコントロール・認証・許可 • 3つのディレクティブ • PerlAccessHandler • PerlAuthenHandler • PerlAuthzHandler

36.

CPAN Module of Apache2::AuthCookie*

37.

CPAN Module of Apache2::AuthCookie* • Apache2::AuthCookie は今もなお精力的 にメンテナンスされている • 今回Apache2::AuthCookie でデモを作っ てみようと思ったが間に合わなかった • すみません

38.

Output Filter Hacks

39.

Output Filter Hacks • PHPの出力の書き換え • Apacheのネイティブフィルタなので、 PHPのob_*系設定等は一切関係無し

40.

Output Filter Hacks • 考えられる用途: • PHPで書ききれない処理を独自マーク アップの形にしておいてPerlで置換 • i-mode絵文字のSoftbank向け変換 (Perlの絵文字変換技術は豊富で高速)

41.

Output Filterの書き方 • Filter の場合 sub handler { ... } は $r (Request Object)ではなく、 $f (Filter Object) を第一引数に受け取る • PerlOutputFilterHandler ディレクティブ

42.

Output Filterの書き方 <VirtualHost *:80> <FilesMatch “.*(html?|php)$”> PerlOutputFilterHandler \ MyApache2::FilterObfuscate </FilesMatch> </VirtualHost>

43.

Output Filterの書き方

44.

DEMO

45.

Filterあれこれ • パフォーマンスは二の次として、pipe的 な処理で良いならApache2.1からの標準 モジュールmod_ lterがあります • 言語は問わない、というか ”*.html” を pipeでw3mに渡してtext/plainに整形して fi 返す等の芸当もできます

46.

Filterあれこれ

47.

まとめ

48.

まとめ • Apache上のPHPであれば、処理の前後に mod_perlで処理を挟むことができる • PHPはレスポンスフェーズ以外では控え 目なので、mod_perlを思う存分使える

49.

最後に

50.

最後に • Webにmod_perlの情報は本当に少ない • mod_perl2ともなると壊滅的 • APR:: Apache2:: ModPerl:: まわり • 他のLLより歴史の古いPerl固有の問題?

51.

日本Perl改造計画 • 「日本Perl改造計画」というレガシー 時代が長かったPerlの情報源を刷新して いく試みがあるようです

52.

日本Perl改造計画 http://d.hatena.ne.jp/syohex/20111110/1320938963

53.

日本Perl改造計画 • WAF全盛期でもApacheは健在 • 今回のようなシチュエーションもある • いざという時のためのmod_perl情報を 提供したい

54.

日本Perl改造計画 • 「日本mod_perl改造計画」をしたい • 日本語でmod_perl(1 and 2)の情報を発信 していくポータルサイト作成を計画中 • トークで話せない分量のネタも公開 • 試みはブログやTwitterで報告します

55.

参考文献 • mod_perl2 User’s Guide (Onyx Neon 2007; http://modperl2book.org/)

56.

ご清聴 ありがとうございました