SlideShare ist ein Scribd-Unternehmen logo
1 von 97
モダンmod_perl入門

     (Modern mod_perl Guide)

     尾形 鉄次 (OGATA Tetsuji)
         Twitter: @xtetsuji
  2012/09/29 YAPC::Asia Tokyo 2012
Attention for audience
• This slide is mainly written by Japanese, and
  few English. In the future, I will write and
  share this slide of English version, perhaps.
• I speach by Japanese language.
• If you do not known Japanese language,
  please fun and feel from some Perl code
  and few English description on this slide.
Self-introduction
自己紹介
• 尾形 鉄次 (OGATA Tetsuji)
• Twitter: @xtetsuji
• Blog: http://post.tetsuji.jp/
• SlideShare: http://www.slideshare.net/xtetsuji
• よく行く: Hokkaido.pm, Hachioji.pm
• 得意技: mod_perl (他はよく知らない)
所属紹介

• 株式会社fonfun(フォンファン)
 http://www.fonfun.co.jp/
 • 主力製品:リモートメール
   http://rmail.jp/
Agenda
Agenda
• About mod_perl basics
• mod_perl handler basics
• Refactoring mod_rewrite
• mod_perl meets PHP
• Apache worker MPM and Perl ithreads
• compare mod_{lang} families
• In future my activities
If time is left

• Compare with others
• Connection cycle:
  Let’s make SMTP Server by mod_perl
• Other topics
In the first
Respect for ...




               モダンPerl入門
(翔泳社 2009; http://books.shoeisha.co.jp/book/b73388.html )
参考文献
• 洋書になりますが、mod_perlを勉強する
 上で役立つ3冊

 • Practical mod_perl
   (Orelly 2003; http://modperlbook.org/)


 • The mod_perl Developer’s Cookbook
   (Sams Publishing 2002; http://www.modperlcookbook.org/)


 • mod_perl2 User’s Guide
   (Onyx Neon 2007; http://modperl2book.org/)
About mod_perl basics
History of mod_perl

• mod_perl1 first public release: 1996/3/25
  (see: http://perl.apache.org/dist/mod_perl-1.0-current/Changes)


• mod_perl2 first public release: 2002/4/6
  (see: http://perl.apache.org/dist/mod_perl-2.0-current/Changes)
Perl CGI の高速化
• mod_perl1
                                           # ↓Apache Configurations

              AddHandler perl-script .pl
              PerlHandler Apache::Registry



• mod_perl2   AddHandler perl-script .pl
              PerlResponseHandler 
                ModPerl::RegistryPrefork


• こう書くことで、拡張子”.pl”のPerl CGI
  が高速化する (Registry→PerlRunでも可)
Perl CGIの高速化

• CGI.pm、CGI::Simple 等は内部で
 mod_perl高速化環境をサポート済み

• とはいえ永続環境なので、グローバル
 変数の扱い等注意が必要
 →モダンPerlなコードを書こう
mod_perlって何?
• Perl CGIの高速化?→副次的な効果
• 本当は「Apacheがモジュールで提供す
 る機能をC言語を使わずPerlで書ける
 ようにしたもの」がmod_perl

• C言語が読み書きできない俺歓喜
About mod_perl basics
• Perl CGIの高速化についてはだいぶ割愛
 させていたきますが、世間に出回って
 いる間違った知識の是正だけはどこか
 でしたい

• 後はApacheのmod_perl拡張ハンドラを
 読み書きして楽しみましょう
mod_perl handler
    basics
mod_perl essence is
 extension of Apache
• mod_perl の Perl CGI高速化環境では、
 HTTPリクエストを受けてレスポンスを
 返すことが出来るのは周知の通り

• mod_perlはHTTPレスポンスを返すだけ
 でなく、その前処理や後処理もできる
Apache internal
• MPMは多く使われているpreforkを想定
• 親プロセスを起動すると、設定に従って
 子プロセスを設定の数だけ起動(prefork)

• 各子プロセスはHTTPリクエストを待つ
• では子プロセスごとのHTTP処理は...
Apache internal
•   リクエストを受ける

•   ヘッダを解析する

•   必要に応じてURLを変換したり、DocumentRootを手がかりに実パスを
    割り出す

•   アクセス制御、認証、承認(BASIC認証など)

•   MIMEタイプを考える

•   レスポンスを出す(静的ファイル、プログラム出力)

•   ログ(アクセスログ、エラーログ)を出力する

•   次のリクエストを待つ
Apache internal

• 各処理を行っている部分にはフックが
 あって、ここに各種処理を挟むことが
 可能 → Apache Module(mod_xxxxxx)

• Apache Module でできることを Perl
 でできるようにしたもの → mod_perl
Apache/mod_perl
   process phase
• 各フックがある部分:
 「(処理)フェーズ」

• リクエスト待ち状態から各フェーズを
 一巡するので、全体を
 「リクエストサイクル」と呼びます
Phase of mod_perl1
           PerlChildInitHandler
       PerlPostReadRequestHandler
               PerlInitHandler
              PerlTransHandler
        PerlHeaderParserHandler
             PerlAccessHandler
            PerlAuthenHandler
             PerlAuthzHandler
              PerlTypeHandler
              PerlFixupHandler
              PerlFixupHandler
                 PerlHandler
               PerlLogHandler
            PerlCleanupHandler
           PerlChildExitHandler
                       ※一部省略があります。詳しくは以下を参照
    http://perl.apache.org/docs/1.0/guide/config.html#toc_Perl_Handlers
Phase of mod_perl1




            ※「Practical mod_perl」より抜粋
Phase of mod_perl2
         PerlChildInitHandler
     PerlPostReadRequestHandler
             PerlInitHandler
            PerlTransHandler
      PerlMapToStorageHandler
      PerlHeaderParserHandler
           PerlAccessHandler
          PerlAuthenHandler
           PerlAuthzHandler
            PerlTypeHandler
            PerlFixupHandler
            PerlFixupHandler
         PerlResponseHandler
             PerlLogHandler
          PerlCleanupHandler
         PerlChildExitHandler
                     ※かなり省略があります。詳しくは以下を参照
           http://perl.apache.org/docs/2.0/user/config/config.html
Phase of mod_perl2




            ※「Practical mod_perl」より抜粋
first mod_perl1 handler
   package MyApache::Hello;

   use strict;
   use warnings;

   use Apache::Constants qw(OK);

   sub handler {
       my $r = shift; # "Apache" object
       $r->send_http_header('text/plain');
       $r->print("Hello! mod_perl1.n");
       return OK;
   }
   1;
first mod_perl2 handler
package MyApache2::Hello;

use strict;
use warnings;

use Apache2::RequestRec (); # for $r->content_type()
use Apache2::RequestIO (); # for $r->print()
use Apache2::Const -compile => qw(OK);

sub handler {
    my $r = shift; # "Apache2::RequestRec" object
    $r->content_type('text/plain');
    $r->print("Hello! mod_perl2.n");
    return Apache2::Const::OK;
}
1;
Apache{1,2} configs
   # Apache1
   <Location />
      SetHandler perl-script
      PerlHandler MyApache1::Hello
   </Location>




   # Apache2
   <Location />
      SetHandler modperl
      PerlResponseHandler MyApache2::Hello
   </Location>
first mod_perl handler
• 全ては sub handler と $r の受け取りから
 • これはどの処理フェーズでも同様
• mod_perl2 では $r のメソッド群が各種
 別パッケージで管理されているため、
 メソッドによって事前に適切な
 Apache2::* を use しておく必要がある
first mod_perl handler

• PerlHandler / PerlResponseHandler にハン
  ドラをセットしておけば、全てのファ
  イルの処理をフックできるので、*.html
  ファイル等をあたかも透過的に処理す
  ることができる → 絵文字処理など
Refactoring
mod_rewrite
About mod_rewrite
• URLを書き換えるApacheモジュール
• 「Apacheのスイス製アーミーナイフ」
• 簡単なコードでURL書き換えが可能だ
 けれど、数十行も書けば魔窟の完成

• 黒魔術と呼ばれる理由
Refactoring
       mod_rewrite
• mod_perl では PerlTransHandler という
  URL を書き換えるフェーズを用意して
  いる

• ここに URL 変換処理を挟める
Apache1 URI Trans
package MyApache1::Trans;

use strict;
use warnings;

use Apache::Constants qw(DECLINED);

sub handler {
    my $r = shift;
    my $uri = $r->uri(); # e.g. "/path/to/foo.html"
    ### ... modify $uri ...
    $r->uri($uri);
    return DECLINED; # I tell a lie that I do nothing.
}
1;
Apache2 URI Trans
package MyApache2::Trans;

use strict;
use warnings;

use Apache2::RequestRec (); # for $r->uri()
use Apache2::Const -compile => qw(DECLINED);

sub handler {
    my $r = shift;
    my $uri = $r->uri(); # e.g. "/path/to/foo.html"
    ### ... modify $uri ...
    $r->uri($uri); # set $uri
    return Apache2::Const::DECLINED;
    # I tell a lie that I do nothing.
}
1;
Apache{1,2} configs

   # Apache1
   # e.g. In <VirtualHost> Directive
   PerlTransHandler MyApache1::Trans




   # Apache2
   # e.g. In <VirtualHost> Directive
   PerlTransHandler MyApache2::Trans
mod_perl URI Trans
pros than mod_rewrite

• mod_rewriteに比べて可読性が高くなる
• DBを引いたりmemcachedにアクセスし
 たりPerlで出来ることは何でもできる
mod_perl URI Trans
cons than mod_rewrite
• 複数のファイル管理が必要となる(*.pm)
• Perl/mod_perlが分からない担当者への
  引き継ぎが難しくなる

• Directory Context(<Location>, .htaccess)
  に書かれたmod_rewrite設定の場合は、
  別途ケアが必要なケースもある
mod_perl meets PHP
PHP pathetic story of
   Perl Monger
• 誰かが発注したアプリがPHP製で、既に
 勝手に納品しちゃっている

• 蓋を開けると実装とかがテキトウ過ぎ
• 契約や諸々の理由で手を入れられない
• 運用担当でPerlしか知らない俺がPHPの
 デバッグとか…
mod_perl meets PHP

• PHPが実行される前後にmod_perlで何か
 フックを差し込めないか

 • PHP処理前に認証・許可処理
 • PHP処理後に出力をフィルタ…等々
Review request phase
Access/Authen/Authz
      and PHP
• session_*()の使い方等がダメなケースで
  は、PHP中のそれらのコードを除去して
  mod_perlのAccess/Authen/Authzフェーズ
  で対処するケースも考えられる

• Cookie、X-UP-Subno等のRequest Header
  は全て読める → 認証を肩代わりできる
package MyApache2::Auth;

use strict;
use warnings;

# $r->headers_in() and $r->headers_out() returns APR::Table
use APR::Table          ();
use Apache2::RequestRec ();
use Apache2::Const -compile => qw(OK REDIRECT);

sub handler {
    my $r = shift;
    my $cookie = $r->headers_in->get('Cookie'); # raw cookie
    my $x_up_subno = $r->headers_in->get('X-UP-Subno');
    my ($is_success, $location, $set_cookie);
    ###
    ### ... modify and analyze this session information ...
    ###
    if ( $is_success ) {
        $r->headers_out->set('Set-Cookie' => $set_cookie);
        return Apache2::Const::OK;
    }
    else {
        $r->headers_out->set(Location => $location);
        $r->err_headers_out->set(Location => $location);
        return Apache2::Const::REDIRECT;
    }
}                                   # e.g. In <VirtualHost> Directive
1;
                                     PerlAccessHandler MyApache2::Auth
Request output filter
     and PHP
• PHPの出力をフィルタする
• Apache2のネイティブフィルタなので、
 PHPの ob_*() (output buffering) 等の設定
 に一切影響されない

• 応用例: 絵文字変換、PHPで書ききれな
 い部分を後で置換する、等々
Requets output filter
      practice
• Filter の場合 sub handler { ... } は
  $r (Request Object)ではなく、
  $f (Filter Object) を第一引数に受け取る

• PerlOutputFilterHandler ディレクティブ
• 今回は改行を除去する簡単なサンプル
  を紹介
package MyApache2::FilterObfuscate;

use   APR::Table          ();
use   Apache2::Filter     ();
use   Apache2::RequestRec ();
use   Apache2::Const -compile => qw(OK);

my $READ_CHUNK_LENGTH = 2048;

sub handler {
    my $f = shift; # $f is "Apache2::Filter" object
    ### If filter is chained, this filter is first?
    unless ($f->ctx) {
        $f->r->headers_out->unset('Content-Length');
        $f->ctx(1);
    }
    while ($f->read(my $buffer, $READ_CHUNK_LENGTH)) {
        $buffer =~ s/[rn]//g;
        $f->print($buffer);
    }
    return Apache2::Const::OK;
}
1;                        # e.g. In <VirtualHost> Directive
                            <FilesMatch “.*(html?|php)$”>
                               PerlOutputFilterHandler MyApache2::FilterObfuscate
                            </FilesMatch>
PHP and Perl are friend

• Apacheの上でPHPとPerlは友達!
• 他にも各種フックを使ってmod_perlは
 PHPを助けることができる

• 可能性は無限大
Apache worker MPM
 and Perl ithreads
Apache worker MPM
 and Perl ithreads
• Apache worker MPM: スレッド(pthread)
  とプロセスのハイブリット動作

• Perl ithreds: 嫌われ者
 • 同時並行処理するならParallel::Prefork
   等やAnyEventを使うのが今のPerl流儀
スレッドのメリット

• 各リクエストフェーズ間で変数共有が
 可能 (poor man’s memcached?)

• 何か人とは違う事をしてるワクワク感
スレッドのデメリット
• Perl ithreadsが安定していない
• 各スレッド毎にインタープリタプール
 を作成する設計上、preforkとコストは
 それほど変わらない

• スレッドセーフを意識する必要がある
Instruction worker
   MPM & mod_perl
• worker MPM上でのmod_perlのノウハウ
 は特に少ないのでハマると危険

• Perlのスレッドは不安定である事を心得
 た上で、複雑な事はさせてはいけない
Queue server by
   mod_perl2 thread
• 今回はスレッドの変数共有を利用した
  mod_perl2の文字列Queueサーバを実演

• “POST /” でRequest BodyをQueueing、
• “GET /” でQueueをPickup
Queue server by
 mod_perl2 thread (1)
package My::Queue;

use strict;
use warnings;

use threads;
use threads::shared;

my @queue :shared;

sub push_queue {
    my $value = shift;
    return 0 if !defined $value;
    push @queue, $value;
    return 1;
}

sub shift_queue {
    return shift @queue
}
1;
Queue server by
 mod_perl2 thread (2)
package MyApache2::ThreadQueue;

use strict;
use warnings;

use threads;

use Apache2::RequestRec ();
use Apache2::RequestIO   ();
use Apache2::Const -compile => qw(OK HTTP_METHOD_NOT_ALLOWED);

use My::Queue;
my $READ_CHUNK_LENGH = 2048;

###
### ... following sub handler { ... } ...
###
Queue server by
 mod_perl2 thread (3)
### continued

sub handler {
    my $r = shift;
    if ( $r->method eq 'POST' ) {
        my $value;
        while ( $r->read(my $buf, $READ_CHUNK_LENGH) ) {
            $value .= $buf;
        }
        My::Queue::push_queue($value);
        $r->content_type('text/plain'); $r->print('Queued');
        return Apache2::Const::OK;
    }
    elsif ( $r->method eq 'GET' ) {
        my $retval = My::Queue::shift_queue();
        $r->content_type('text/plain'); $r->print($retval);
        return Apache2::Const::OK;
    }
    else {
        return Apache2::Const::HTTP_METHOD_NOT_ALLOWED;
    }
}
1;
worker MPM and
perl ithreads practice
• 複雑な事はさせてはいけない
• 複雑な事をさせる場合には十分試験を
• 大事なことなので(ry
• 前出のQueue serverは100KB程度の文字
 列の入出力を10K/minさせても問題無し
compare mod_{lang}
     families
mod_{lang} (1)
• mod_perl: 最も歴史が古いものの一つ
• mod_ruby: 開発停滞状態→mod_mruby
• mod_python: 開発停滞状態
• mod_lua: Apache2.4からコアモジュール
• mod_mruby: 2012年4月に登場し活発
mod_{lang} (2)
• mod_wsgi: Python WSGI 実装
• mod_php: いわゆるPHP
 • こちらは今までの意味でApacheを
  「拡張」するものではない

• 他にもたくさんmod_{lang}はあるらしい
Benchmark




     http://blog.matsumoto-r.jp/?p=2669 より
Benchmark




     http://blog.matsumoto-r.jp/?p=2669 より
Benchmark

• Perl CGI高速化環境(PerlRun, Registry)の
  場合はmtime(ファイルの最終更新日時)
  を都度見るので、statシステムコールの
  コストが無視できない

• mod_perlネイティブハンドラで勝負!
Benchmark
• 実際、mod_perlネイティブハンドラで
  同等のベンチマークを行うと
  About 7000 Response/secとのこと
  (Thanks @matsumotory)
• Yet another perl5 implement で mod_*perl
  を作ると良い勝負ができるかな
In future my activities
In future my activities

• mod_perlの役立つ情報やコードを公開
 していきたい

• mod_perlで困っている人を助けたい
In future my activities
• 今後もmod_perl界隈を盛り上げたい
• Twitterアカウント作った
 @mod_perl_info
• ウェブサイトも作成中(未完成)
 http://modperl.info/
• 詳細、割愛した部分の続きはどこかで
Timeup?
Questions?
☆Service Slides☆
Compare with others
Compare with others

• Pure CGI
• FastCGI
• PSGI/Plack, WAF
mod_perl and
     pure CGI
• パフォーマンスを要求しなければ良い
• Apache以外のウェブサーバでも使える
• レンタルサーバ等、mod_perlすら使え
 ない環境は未だに多い
mod_perl and FastCGI
• どちらも同じ永続環境、適材適所
• Apache拡張ならmod_perl、CGIの高速化
 のみならFastCGI

• mod_perlの場合Apacheプロセス自身が
 肥大化していくことを嫌う向きもある
mod_perl and
  PSGI/Plack, WAF
• モダンなウェブアプリを今から書くの
 であればPlackベースのWAFを選ぼう

• Apacheを拡張して他の言語との連携や
 Apache自体の動作を拡張できるのは
 mod_perlの面目躍如
Should you choice
     mod_perl?
• Apacheという枠の中ではあるものの、
 mod_perlの可能性はとても広い

• パフォーマンス、移植性、様々な要素
 を検討して、mod_perlを使うか考える

• 既にあるApache上のレガシーコードを
 リファクタリングするなら良い選択
Connection cycle:
 Let’s make SMTP
Server by mod_perl
Connection cycle
• HTTP以外のサーバを書きたい
• Apacheと同様の安定性が欲しい
• Apache2/mod_perl2では、Connectionを
 HTTP以外の自前のものに書き換える事
 ができる (e.g. mod_ssl)
About
Connection Cycle
   PerlPreConnectionHandler
 PerlProcessConnectionHandler




                        ※「Practical mod_perl」より抜粋
Why I want to write
 SMTP server by perl
• DB引きたい
• 絵文字処理したい
• 通常のMTA(Sendmail/qmail/Postfix等)の
 pipeではスケールできない
Qpsmtpd

• http://smtpd.develooper.com/
• 実際に私(会社)もmod_perl2 Connection
 cycleでSMTPサーバを実装してみたもの
 の、既にPerl界隈にはQpsmtpdという
 MTAがある
Qpsmtpd has some
  Engine=Transport
• pipe (CGI like)
• fork-server
• prefork-server
• Apache (Apache::Qpsmtpd)
• async (Danga::Socket base)
Qpsmtpd’s
   Apache::Qpsmtpd
• Apache2 / mod_perl2 の Connection cycle
  の良い応用例

• これを見るとApache2をEngineとして
  MTAを作る方法が良く分かる
Other topics
Test of mod_perl
        handler
• 「モダンPerl入門」に詳しく書いてある
• Apache2::FakeRequestを使って偽物の$r
 を作ってハンドラをテストできる

• 処理単位のテストはTest::More等で
• 詳しくは割愛、もしくは上述の書籍を
nginx:
  HttpPerlModule




http://wiki.nginx.org/HttpPerlModule
nginx:
   HttpPerlModule
• 構文や考え方がmod_perl1と酷似
 →mod_perlの知識を流用可能

• ただしイベント駆動サーバならではの
 各種制限もあるので注意

• 世間での応用例も少し出てきている
• 以前はEmbeddedPerlModuleという
 名前だった(1.0→1.2で名称変更?)
nginx:
HttpPerlModule
package hello;
use nginx;

sub handler {
  my $r = shift;
  $r->send_http_header("text/html");
  return OK if $r->header_only;

    $r->print("hello!n<br/>");
    $r->rflush;

    if (-f $r->filename or -d _) {
      $r->print($r->uri, " exists!n");
    }

    return OK;
}

1;
__END__



      http://wiki.nginx.org/HttpPerlModule より
nginx:
    HttpPerlModule
• mod_perl2ではなくmod_perl1の構文の
 影響を強く受けている
 ($r->send_http_headers()等に見られる)

• nginx設定ファイルの書き方については
 割愛→前述のWikiに詳細がある
割愛したこと
• Perl CGIの高速化環境の詳細
• Apache2.4環境でのmod_perl→現時点
 (2012/09)で正式にサポートしていない

• Apache2.4 event MPM環境での
 mod_perl→上記同様
これからのApache
• Apache2.4でmod_perlがサポートされた
 ら、event MPM上でmod_perl動かしたい

• Apacheはこれからも進化していきます
• mod_lua, mod_sedがApache2.4でコアモ
 ジュール入り、しかしExperimental扱い
Questions?
ご清聴
ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

php7's ast
php7's astphp7's ast
php7's astdo_aki
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopmPerl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm鉄次 尾形
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
Functions
FunctionsFunctions
Functionsdo_aki
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作るgoccy
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014Rui Hirokawa
 
about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタl_b__
 

Was ist angesagt? (20)

php7's ast
php7's astphp7's ast
php7's ast
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopmPerl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
Functions
FunctionsFunctions
Functions
 
about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作る
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
Minix smp
Minix smpMinix smp
Minix smp
 
about Thrift
about Thriftabout Thrift
about Thrift
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 

Ähnlich wie モダンmod_perl入門 #yapcasia

Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100ichikaway
 
20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyoichikaway
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理Akihiro Kitada
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Kimiyuki Yamauchi
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy toolYuki Shibazaki
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
FuelPHPをさわってみて
FuelPHPをさわってみてFuelPHPをさわってみて
FuelPHPをさわってみてSotaro Omura
 

Ähnlich wie モダンmod_perl入門 #yapcasia (20)

Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100
 
Niigata.pm #1
Niigata.pm #1Niigata.pm #1
Niigata.pm #1
 
Perl勉強会#2資料
Perl勉強会#2資料Perl勉強会#2資料
Perl勉強会#2資料
 
20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理
 
0x300
0x3000x300
0x300
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy tool
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
FuelPHPをさわってみて
FuelPHPをさわってみてFuelPHPをさわってみて
FuelPHPをさわってみて
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 

Mehr von 鉄次 尾形

Perl入学式 2018年度の報告
Perl入学式 2018年度の報告Perl入学式 2018年度の報告
Perl入学式 2018年度の報告鉄次 尾形
 
【公開版】AWS基礎 for 新卒エンジニア
【公開版】AWS基礎 for 新卒エンジニア【公開版】AWS基礎 for 新卒エンジニア
【公開版】AWS基礎 for 新卒エンジニア鉄次 尾形
 
俺のこだわりデスクのその後
俺のこだわりデスクのその後俺のこだわりデスクのその後
俺のこだわりデスクのその後鉄次 尾形
 
WordPress 運用を支える Perl
WordPress 運用を支える PerlWordPress 運用を支える Perl
WordPress 運用を支える Perl鉄次 尾形
 
障害対応とその防止策
障害対応とその防止策障害対応とその防止策
障害対応とその防止策鉄次 尾形
 
働きやすい社内を目指す!二酸化炭素計測ツール
働きやすい社内を目指す!二酸化炭素計測ツール働きやすい社内を目指す!二酸化炭素計測ツール
働きやすい社内を目指す!二酸化炭素計測ツール鉄次 尾形
 
Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜鉄次 尾形
 
コードの動的生成のお話
コードの動的生成のお話コードの動的生成のお話
コードの動的生成のお話鉄次 尾形
 
三角関数の加法定理はなぜ難しいのか
三角関数の加法定理はなぜ難しいのか三角関数の加法定理はなぜ難しいのか
三角関数の加法定理はなぜ難しいのか鉄次 尾形
 
Perlで生きる10年
Perlで生きる10年Perlで生きる10年
Perlで生きる10年鉄次 尾形
 
穏やかにファイルを削除する続き
穏やかにファイルを削除する続き穏やかにファイルを削除する続き
穏やかにファイルを削除する続き鉄次 尾形
 
日本全国ぶらりPerl旅
日本全国ぶらりPerl旅日本全国ぶらりPerl旅
日本全国ぶらりPerl旅鉄次 尾形
 
穏やかにファイルを削除する
穏やかにファイルを削除する穏やかにファイルを削除する
穏やかにファイルを削除する鉄次 尾形
 
最近のメールまわりのお仕事のお話
最近のメールまわりのお仕事のお話最近のメールまわりのお仕事のお話
最近のメールまわりのお仕事のお話鉄次 尾形
 
再帰、漸化式、差分方程式とアルゴリズム Gx#20
再帰、漸化式、差分方程式とアルゴリズム   Gx#20再帰、漸化式、差分方程式とアルゴリズム   Gx#20
再帰、漸化式、差分方程式とアルゴリズム Gx#20鉄次 尾形
 
超小規模環境のMySQL #mysqlcasual
超小規模環境のMySQL #mysqlcasual超小規模環境のMySQL #mysqlcasual
超小規模環境のMySQL #mysqlcasual鉄次 尾形
 
mod_perlプログラマーがYAPCで語るレガシー開発論
mod_perlプログラマーがYAPCで語るレガシー開発論mod_perlプログラマーがYAPCで語るレガシー開発論
mod_perlプログラマーがYAPCで語るレガシー開発論鉄次 尾形
 
東京近郊のPerlコミュニティのご紹介 #lcs2015
東京近郊のPerlコミュニティのご紹介 #lcs2015東京近郊のPerlコミュニティのご紹介 #lcs2015
東京近郊のPerlコミュニティのご紹介 #lcs2015鉄次 尾形
 
4月16日だからFoursquare 位置情報とライフログ
4月16日だからFoursquare 位置情報とライフログ4月16日だからFoursquare 位置情報とライフログ
4月16日だからFoursquare 位置情報とライフログ鉄次 尾形
 

Mehr von 鉄次 尾形 (20)

Perl入学式 2018年度の報告
Perl入学式 2018年度の報告Perl入学式 2018年度の報告
Perl入学式 2018年度の報告
 
【公開版】AWS基礎 for 新卒エンジニア
【公開版】AWS基礎 for 新卒エンジニア【公開版】AWS基礎 for 新卒エンジニア
【公開版】AWS基礎 for 新卒エンジニア
 
俺のこだわりデスクのその後
俺のこだわりデスクのその後俺のこだわりデスクのその後
俺のこだわりデスクのその後
 
Hokkaido.pmと7年
Hokkaido.pmと7年Hokkaido.pmと7年
Hokkaido.pmと7年
 
WordPress 運用を支える Perl
WordPress 運用を支える PerlWordPress 運用を支える Perl
WordPress 運用を支える Perl
 
障害対応とその防止策
障害対応とその防止策障害対応とその防止策
障害対応とその防止策
 
働きやすい社内を目指す!二酸化炭素計測ツール
働きやすい社内を目指す!二酸化炭素計測ツール働きやすい社内を目指す!二酸化炭素計測ツール
働きやすい社内を目指す!二酸化炭素計測ツール
 
Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜
 
コードの動的生成のお話
コードの動的生成のお話コードの動的生成のお話
コードの動的生成のお話
 
三角関数の加法定理はなぜ難しいのか
三角関数の加法定理はなぜ難しいのか三角関数の加法定理はなぜ難しいのか
三角関数の加法定理はなぜ難しいのか
 
Perlで生きる10年
Perlで生きる10年Perlで生きる10年
Perlで生きる10年
 
穏やかにファイルを削除する続き
穏やかにファイルを削除する続き穏やかにファイルを削除する続き
穏やかにファイルを削除する続き
 
日本全国ぶらりPerl旅
日本全国ぶらりPerl旅日本全国ぶらりPerl旅
日本全国ぶらりPerl旅
 
穏やかにファイルを削除する
穏やかにファイルを削除する穏やかにファイルを削除する
穏やかにファイルを削除する
 
最近のメールまわりのお仕事のお話
最近のメールまわりのお仕事のお話最近のメールまわりのお仕事のお話
最近のメールまわりのお仕事のお話
 
再帰、漸化式、差分方程式とアルゴリズム Gx#20
再帰、漸化式、差分方程式とアルゴリズム   Gx#20再帰、漸化式、差分方程式とアルゴリズム   Gx#20
再帰、漸化式、差分方程式とアルゴリズム Gx#20
 
超小規模環境のMySQL #mysqlcasual
超小規模環境のMySQL #mysqlcasual超小規模環境のMySQL #mysqlcasual
超小規模環境のMySQL #mysqlcasual
 
mod_perlプログラマーがYAPCで語るレガシー開発論
mod_perlプログラマーがYAPCで語るレガシー開発論mod_perlプログラマーがYAPCで語るレガシー開発論
mod_perlプログラマーがYAPCで語るレガシー開発論
 
東京近郊のPerlコミュニティのご紹介 #lcs2015
東京近郊のPerlコミュニティのご紹介 #lcs2015東京近郊のPerlコミュニティのご紹介 #lcs2015
東京近郊のPerlコミュニティのご紹介 #lcs2015
 
4月16日だからFoursquare 位置情報とライフログ
4月16日だからFoursquare 位置情報とライフログ4月16日だからFoursquare 位置情報とライフログ
4月16日だからFoursquare 位置情報とライフログ
 

Kürzlich hochgeladen

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Kürzlich hochgeladen (8)

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

モダンmod_perl入門 #yapcasia

  • 1. モダンmod_perl入門 (Modern mod_perl Guide) 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2012/09/29 YAPC::Asia Tokyo 2012
  • 2. Attention for audience • This slide is mainly written by Japanese, and few English. In the future, I will write and share this slide of English version, perhaps. • I speach by Japanese language. • If you do not known Japanese language, please fun and feel from some Perl code and few English description on this slide.
  • 4. 自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • SlideShare: http://www.slideshare.net/xtetsuji • よく行く: Hokkaido.pm, Hachioji.pm • 得意技: mod_perl (他はよく知らない)
  • 5. 所属紹介 • 株式会社fonfun(フォンファン) http://www.fonfun.co.jp/ • 主力製品:リモートメール http://rmail.jp/
  • 7. Agenda • About mod_perl basics • mod_perl handler basics • Refactoring mod_rewrite • mod_perl meets PHP • Apache worker MPM and Perl ithreads • compare mod_{lang} families • In future my activities
  • 8. If time is left • Compare with others • Connection cycle: Let’s make SMTP Server by mod_perl • Other topics
  • 10. Respect for ... モダンPerl入門 (翔泳社 2009; http://books.shoeisha.co.jp/book/b73388.html )
  • 11. 参考文献 • 洋書になりますが、mod_perlを勉強する 上で役立つ3冊 • Practical mod_perl (Orelly 2003; http://modperlbook.org/) • The mod_perl Developer’s Cookbook (Sams Publishing 2002; http://www.modperlcookbook.org/) • mod_perl2 User’s Guide (Onyx Neon 2007; http://modperl2book.org/)
  • 12.
  • 14. History of mod_perl • mod_perl1 first public release: 1996/3/25 (see: http://perl.apache.org/dist/mod_perl-1.0-current/Changes) • mod_perl2 first public release: 2002/4/6 (see: http://perl.apache.org/dist/mod_perl-2.0-current/Changes)
  • 15. Perl CGI の高速化 • mod_perl1 # ↓Apache Configurations AddHandler perl-script .pl PerlHandler Apache::Registry • mod_perl2 AddHandler perl-script .pl PerlResponseHandler ModPerl::RegistryPrefork • こう書くことで、拡張子”.pl”のPerl CGI が高速化する (Registry→PerlRunでも可)
  • 16. Perl CGIの高速化 • CGI.pm、CGI::Simple 等は内部で mod_perl高速化環境をサポート済み • とはいえ永続環境なので、グローバル 変数の扱い等注意が必要 →モダンPerlなコードを書こう
  • 17. mod_perlって何? • Perl CGIの高速化?→副次的な効果 • 本当は「Apacheがモジュールで提供す る機能をC言語を使わずPerlで書ける ようにしたもの」がmod_perl • C言語が読み書きできない俺歓喜
  • 18. About mod_perl basics • Perl CGIの高速化についてはだいぶ割愛 させていたきますが、世間に出回って いる間違った知識の是正だけはどこか でしたい • 後はApacheのmod_perl拡張ハンドラを 読み書きして楽しみましょう
  • 20. mod_perl essence is extension of Apache • mod_perl の Perl CGI高速化環境では、 HTTPリクエストを受けてレスポンスを 返すことが出来るのは周知の通り • mod_perlはHTTPレスポンスを返すだけ でなく、その前処理や後処理もできる
  • 21. Apache internal • MPMは多く使われているpreforkを想定 • 親プロセスを起動すると、設定に従って 子プロセスを設定の数だけ起動(prefork) • 各子プロセスはHTTPリクエストを待つ • では子プロセスごとのHTTP処理は...
  • 22. Apache internal • リクエストを受ける • ヘッダを解析する • 必要に応じてURLを変換したり、DocumentRootを手がかりに実パスを 割り出す • アクセス制御、認証、承認(BASIC認証など) • MIMEタイプを考える • レスポンスを出す(静的ファイル、プログラム出力) • ログ(アクセスログ、エラーログ)を出力する • 次のリクエストを待つ
  • 23. Apache internal • 各処理を行っている部分にはフックが あって、ここに各種処理を挟むことが 可能 → Apache Module(mod_xxxxxx) • Apache Module でできることを Perl でできるようにしたもの → mod_perl
  • 24. Apache/mod_perl process phase • 各フックがある部分: 「(処理)フェーズ」 • リクエスト待ち状態から各フェーズを 一巡するので、全体を 「リクエストサイクル」と呼びます
  • 25. Phase of mod_perl1 PerlChildInitHandler PerlPostReadRequestHandler PerlInitHandler PerlTransHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlFixupHandler PerlHandler PerlLogHandler PerlCleanupHandler PerlChildExitHandler ※一部省略があります。詳しくは以下を参照 http://perl.apache.org/docs/1.0/guide/config.html#toc_Perl_Handlers
  • 26. Phase of mod_perl1 ※「Practical mod_perl」より抜粋
  • 27. Phase of mod_perl2 PerlChildInitHandler PerlPostReadRequestHandler PerlInitHandler PerlTransHandler PerlMapToStorageHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlFixupHandler PerlResponseHandler PerlLogHandler PerlCleanupHandler PerlChildExitHandler ※かなり省略があります。詳しくは以下を参照 http://perl.apache.org/docs/2.0/user/config/config.html
  • 28. Phase of mod_perl2 ※「Practical mod_perl」より抜粋
  • 29. first mod_perl1 handler package MyApache::Hello; use strict; use warnings; use Apache::Constants qw(OK); sub handler { my $r = shift; # "Apache" object $r->send_http_header('text/plain'); $r->print("Hello! mod_perl1.n"); return OK; } 1;
  • 30. first mod_perl2 handler package MyApache2::Hello; use strict; use warnings; use Apache2::RequestRec (); # for $r->content_type() use Apache2::RequestIO (); # for $r->print() use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # "Apache2::RequestRec" object $r->content_type('text/plain'); $r->print("Hello! mod_perl2.n"); return Apache2::Const::OK; } 1;
  • 31. Apache{1,2} configs # Apache1 <Location /> SetHandler perl-script PerlHandler MyApache1::Hello </Location> # Apache2 <Location /> SetHandler modperl PerlResponseHandler MyApache2::Hello </Location>
  • 32. first mod_perl handler • 全ては sub handler と $r の受け取りから • これはどの処理フェーズでも同様 • mod_perl2 では $r のメソッド群が各種 別パッケージで管理されているため、 メソッドによって事前に適切な Apache2::* を use しておく必要がある
  • 33. first mod_perl handler • PerlHandler / PerlResponseHandler にハン ドラをセットしておけば、全てのファ イルの処理をフックできるので、*.html ファイル等をあたかも透過的に処理す ることができる → 絵文字処理など
  • 35. About mod_rewrite • URLを書き換えるApacheモジュール • 「Apacheのスイス製アーミーナイフ」 • 簡単なコードでURL書き換えが可能だ けれど、数十行も書けば魔窟の完成 • 黒魔術と呼ばれる理由
  • 36. Refactoring mod_rewrite • mod_perl では PerlTransHandler という URL を書き換えるフェーズを用意して いる • ここに URL 変換処理を挟める
  • 37. Apache1 URI Trans package MyApache1::Trans; use strict; use warnings; use Apache::Constants qw(DECLINED); sub handler { my $r = shift; my $uri = $r->uri(); # e.g. "/path/to/foo.html" ### ... modify $uri ... $r->uri($uri); return DECLINED; # I tell a lie that I do nothing. } 1;
  • 38. Apache2 URI Trans package MyApache2::Trans; use strict; use warnings; use Apache2::RequestRec (); # for $r->uri() use Apache2::Const -compile => qw(DECLINED); sub handler { my $r = shift; my $uri = $r->uri(); # e.g. "/path/to/foo.html" ### ... modify $uri ... $r->uri($uri); # set $uri return Apache2::Const::DECLINED; # I tell a lie that I do nothing. } 1;
  • 39. Apache{1,2} configs # Apache1 # e.g. In <VirtualHost> Directive PerlTransHandler MyApache1::Trans # Apache2 # e.g. In <VirtualHost> Directive PerlTransHandler MyApache2::Trans
  • 40. mod_perl URI Trans pros than mod_rewrite • mod_rewriteに比べて可読性が高くなる • DBを引いたりmemcachedにアクセスし たりPerlで出来ることは何でもできる
  • 41. mod_perl URI Trans cons than mod_rewrite • 複数のファイル管理が必要となる(*.pm) • Perl/mod_perlが分からない担当者への 引き継ぎが難しくなる • Directory Context(<Location>, .htaccess) に書かれたmod_rewrite設定の場合は、 別途ケアが必要なケースもある
  • 43. PHP pathetic story of Perl Monger • 誰かが発注したアプリがPHP製で、既に 勝手に納品しちゃっている • 蓋を開けると実装とかがテキトウ過ぎ • 契約や諸々の理由で手を入れられない • 運用担当でPerlしか知らない俺がPHPの デバッグとか…
  • 44. mod_perl meets PHP • PHPが実行される前後にmod_perlで何か フックを差し込めないか • PHP処理前に認証・許可処理 • PHP処理後に出力をフィルタ…等々
  • 46. Access/Authen/Authz and PHP • session_*()の使い方等がダメなケースで は、PHP中のそれらのコードを除去して mod_perlのAccess/Authen/Authzフェーズ で対処するケースも考えられる • Cookie、X-UP-Subno等のRequest Header は全て読める → 認証を肩代わりできる
  • 47. package MyApache2::Auth; use strict; use warnings; # $r->headers_in() and $r->headers_out() returns APR::Table use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK REDIRECT); sub handler { my $r = shift; my $cookie = $r->headers_in->get('Cookie'); # raw cookie my $x_up_subno = $r->headers_in->get('X-UP-Subno'); my ($is_success, $location, $set_cookie); ### ### ... modify and analyze this session information ... ### if ( $is_success ) { $r->headers_out->set('Set-Cookie' => $set_cookie); return Apache2::Const::OK; } else { $r->headers_out->set(Location => $location); $r->err_headers_out->set(Location => $location); return Apache2::Const::REDIRECT; } } # e.g. In <VirtualHost> Directive 1; PerlAccessHandler MyApache2::Auth
  • 48. Request output filter and PHP • PHPの出力をフィルタする • Apache2のネイティブフィルタなので、 PHPの ob_*() (output buffering) 等の設定 に一切影響されない • 応用例: 絵文字変換、PHPで書ききれな い部分を後で置換する、等々
  • 49. Requets output filter practice • Filter の場合 sub handler { ... } は $r (Request Object)ではなく、 $f (Filter Object) を第一引数に受け取る • PerlOutputFilterHandler ディレクティブ • 今回は改行を除去する簡単なサンプル を紹介
  • 50. package MyApache2::FilterObfuscate; use APR::Table (); use Apache2::Filter (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); my $READ_CHUNK_LENGTH = 2048; sub handler { my $f = shift; # $f is "Apache2::Filter" object ### If filter is chained, this filter is first? unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } while ($f->read(my $buffer, $READ_CHUNK_LENGTH)) { $buffer =~ s/[rn]//g; $f->print($buffer); } return Apache2::Const::OK; } 1; # e.g. In <VirtualHost> Directive <FilesMatch “.*(html?|php)$”> PerlOutputFilterHandler MyApache2::FilterObfuscate </FilesMatch>
  • 51. PHP and Perl are friend • Apacheの上でPHPとPerlは友達! • 他にも各種フックを使ってmod_perlは PHPを助けることができる • 可能性は無限大
  • 52. Apache worker MPM and Perl ithreads
  • 53. Apache worker MPM and Perl ithreads • Apache worker MPM: スレッド(pthread) とプロセスのハイブリット動作 • Perl ithreds: 嫌われ者 • 同時並行処理するならParallel::Prefork 等やAnyEventを使うのが今のPerl流儀
  • 54. スレッドのメリット • 各リクエストフェーズ間で変数共有が 可能 (poor man’s memcached?) • 何か人とは違う事をしてるワクワク感
  • 55. スレッドのデメリット • Perl ithreadsが安定していない • 各スレッド毎にインタープリタプール を作成する設計上、preforkとコストは それほど変わらない • スレッドセーフを意識する必要がある
  • 56. Instruction worker MPM & mod_perl • worker MPM上でのmod_perlのノウハウ は特に少ないのでハマると危険 • Perlのスレッドは不安定である事を心得 た上で、複雑な事はさせてはいけない
  • 57. Queue server by mod_perl2 thread • 今回はスレッドの変数共有を利用した mod_perl2の文字列Queueサーバを実演 • “POST /” でRequest BodyをQueueing、 • “GET /” でQueueをPickup
  • 58. Queue server by mod_perl2 thread (1) package My::Queue; use strict; use warnings; use threads; use threads::shared; my @queue :shared; sub push_queue { my $value = shift; return 0 if !defined $value; push @queue, $value; return 1; } sub shift_queue { return shift @queue } 1;
  • 59. Queue server by mod_perl2 thread (2) package MyApache2::ThreadQueue; use strict; use warnings; use threads; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK HTTP_METHOD_NOT_ALLOWED); use My::Queue; my $READ_CHUNK_LENGH = 2048; ### ### ... following sub handler { ... } ... ###
  • 60. Queue server by mod_perl2 thread (3) ### continued sub handler { my $r = shift; if ( $r->method eq 'POST' ) { my $value; while ( $r->read(my $buf, $READ_CHUNK_LENGH) ) { $value .= $buf; } My::Queue::push_queue($value); $r->content_type('text/plain'); $r->print('Queued'); return Apache2::Const::OK; } elsif ( $r->method eq 'GET' ) { my $retval = My::Queue::shift_queue(); $r->content_type('text/plain'); $r->print($retval); return Apache2::Const::OK; } else { return Apache2::Const::HTTP_METHOD_NOT_ALLOWED; } } 1;
  • 61. worker MPM and perl ithreads practice • 複雑な事はさせてはいけない • 複雑な事をさせる場合には十分試験を • 大事なことなので(ry • 前出のQueue serverは100KB程度の文字 列の入出力を10K/minさせても問題無し
  • 62. compare mod_{lang} families
  • 63. mod_{lang} (1) • mod_perl: 最も歴史が古いものの一つ • mod_ruby: 開発停滞状態→mod_mruby • mod_python: 開発停滞状態 • mod_lua: Apache2.4からコアモジュール • mod_mruby: 2012年4月に登場し活発
  • 64. mod_{lang} (2) • mod_wsgi: Python WSGI 実装 • mod_php: いわゆるPHP • こちらは今までの意味でApacheを 「拡張」するものではない • 他にもたくさんmod_{lang}はあるらしい
  • 65. Benchmark http://blog.matsumoto-r.jp/?p=2669 より
  • 66. Benchmark http://blog.matsumoto-r.jp/?p=2669 より
  • 67. Benchmark • Perl CGI高速化環境(PerlRun, Registry)の 場合はmtime(ファイルの最終更新日時) を都度見るので、statシステムコールの コストが無視できない • mod_perlネイティブハンドラで勝負!
  • 68. Benchmark • 実際、mod_perlネイティブハンドラで 同等のベンチマークを行うと About 7000 Response/secとのこと (Thanks @matsumotory) • Yet another perl5 implement で mod_*perl を作ると良い勝負ができるかな
  • 69. In future my activities
  • 70. In future my activities • mod_perlの役立つ情報やコードを公開 していきたい • mod_perlで困っている人を助けたい
  • 71. In future my activities • 今後もmod_perl界隈を盛り上げたい • Twitterアカウント作った @mod_perl_info • ウェブサイトも作成中(未完成) http://modperl.info/ • 詳細、割愛した部分の続きはどこかで
  • 76. Compare with others • Pure CGI • FastCGI • PSGI/Plack, WAF
  • 77. mod_perl and pure CGI • パフォーマンスを要求しなければ良い • Apache以外のウェブサーバでも使える • レンタルサーバ等、mod_perlすら使え ない環境は未だに多い
  • 78. mod_perl and FastCGI • どちらも同じ永続環境、適材適所 • Apache拡張ならmod_perl、CGIの高速化 のみならFastCGI • mod_perlの場合Apacheプロセス自身が 肥大化していくことを嫌う向きもある
  • 79. mod_perl and PSGI/Plack, WAF • モダンなウェブアプリを今から書くの であればPlackベースのWAFを選ぼう • Apacheを拡張して他の言語との連携や Apache自体の動作を拡張できるのは mod_perlの面目躍如
  • 80. Should you choice mod_perl? • Apacheという枠の中ではあるものの、 mod_perlの可能性はとても広い • パフォーマンス、移植性、様々な要素 を検討して、mod_perlを使うか考える • 既にあるApache上のレガシーコードを リファクタリングするなら良い選択
  • 81. Connection cycle: Let’s make SMTP Server by mod_perl
  • 82. Connection cycle • HTTP以外のサーバを書きたい • Apacheと同様の安定性が欲しい • Apache2/mod_perl2では、Connectionを HTTP以外の自前のものに書き換える事 ができる (e.g. mod_ssl)
  • 83. About Connection Cycle PerlPreConnectionHandler PerlProcessConnectionHandler ※「Practical mod_perl」より抜粋
  • 84. Why I want to write SMTP server by perl • DB引きたい • 絵文字処理したい • 通常のMTA(Sendmail/qmail/Postfix等)の pipeではスケールできない
  • 85. Qpsmtpd • http://smtpd.develooper.com/ • 実際に私(会社)もmod_perl2 Connection cycleでSMTPサーバを実装してみたもの の、既にPerl界隈にはQpsmtpdという MTAがある
  • 86. Qpsmtpd has some Engine=Transport • pipe (CGI like) • fork-server • prefork-server • Apache (Apache::Qpsmtpd) • async (Danga::Socket base)
  • 87. Qpsmtpd’s Apache::Qpsmtpd • Apache2 / mod_perl2 の Connection cycle の良い応用例 • これを見るとApache2をEngineとして MTAを作る方法が良く分かる
  • 89. Test of mod_perl handler • 「モダンPerl入門」に詳しく書いてある • Apache2::FakeRequestを使って偽物の$r を作ってハンドラをテストできる • 処理単位のテストはTest::More等で • 詳しくは割愛、もしくは上述の書籍を
  • 91. nginx: HttpPerlModule • 構文や考え方がmod_perl1と酷似 →mod_perlの知識を流用可能 • ただしイベント駆動サーバならではの 各種制限もあるので注意 • 世間での応用例も少し出てきている • 以前はEmbeddedPerlModuleという 名前だった(1.0→1.2で名称変更?)
  • 92. nginx: HttpPerlModule package hello; use nginx; sub handler { my $r = shift; $r->send_http_header("text/html"); return OK if $r->header_only; $r->print("hello!n<br/>"); $r->rflush; if (-f $r->filename or -d _) { $r->print($r->uri, " exists!n"); } return OK; } 1; __END__ http://wiki.nginx.org/HttpPerlModule より
  • 93. nginx: HttpPerlModule • mod_perl2ではなくmod_perl1の構文の 影響を強く受けている ($r->send_http_headers()等に見られる) • nginx設定ファイルの書き方については 割愛→前述のWikiに詳細がある
  • 94. 割愛したこと • Perl CGIの高速化環境の詳細 • Apache2.4環境でのmod_perl→現時点 (2012/09)で正式にサポートしていない • Apache2.4 event MPM環境での mod_perl→上記同様
  • 95. これからのApache • Apache2.4でmod_perlがサポートされた ら、event MPM上でmod_perl動かしたい • Apacheはこれからも進化していきます • mod_lua, mod_sedがApache2.4でコアモ ジュール入り、しかしExperimental扱い

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. &amp;#x5F53;&amp;#x7136;Apache1&amp;#x3068;Apache2&amp;#x306E;&amp;#x6B74;&amp;#x53F2;&amp;#x306F;&amp;#x305D;&amp;#x308C;&amp;#x3088;&amp;#x308A;&amp;#x524D;\n2003&amp;#x5E74;&amp;#x306B;&amp;#x306F;Apache2/mod_perl2&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x3044;&amp;#x305F;&amp;#x3051;&amp;#x3069;&amp;#x3001;&amp;#x5F53;&amp;#x6642;&amp;#x306F;&amp;#x307E;&amp;#x3060;&amp;#x3053;&amp;#x306A;&amp;#x308C;&amp;#x3066;&amp;#x3044;&amp;#x306A;&amp;#x304B;&amp;#x3063;&amp;#x305F;&amp;#x306E;&amp;#x3067;&amp;#x3001;2003&amp;#x5E74;&amp;#x306E;&amp;#x30EA;&amp;#x30E2;&amp;#x30FC;&amp;#x30C8;&amp;#x30E1;&amp;#x30FC;&amp;#x30EB;&amp;#x7B2C;4&amp;#x4E16;&amp;#x4EE3;&amp;#x306F;Apache1.3/mod_perl1&amp;#x3067;&amp;#x4F5C;&amp;#x6210;&amp;#x3057;&amp;#x307E;&amp;#x3057;&amp;#x305F;\n
  15. &amp;#x66F8;&amp;#x3044;&amp;#x305F;&amp;#x3053;&amp;#x3068;&amp;#x304C;&amp;#x3042;&amp;#x308B;&amp;#x65B9;&amp;#x3082;&amp;#x591A;&amp;#x3044;&amp;#x3001;&amp;#x57FA;&amp;#x672C;&amp;#x3067;&amp;#x3059;&amp;#x306D;\n&amp;#x30B9;&amp;#x30DA;&amp;#x30FC;&amp;#x30B9;&amp;#x306E;&amp;#x90FD;&amp;#x5408;&amp;#x3067;&amp;#x6539;&amp;#x884C;&amp;#x3092; \\ &amp;#x3067;&amp;#x30A8;&amp;#x30B9;&amp;#x30B1;&amp;#x30FC;&amp;#x30D7;&amp;#x3057;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x5B9F;&amp;#x969B;&amp;#x306B;&amp;#x3053;&amp;#x3046;&amp;#x3044;&amp;#x3046;&amp;#x66F8;&amp;#x304D;&amp;#x65B9;&amp;#x3082;&amp;#x3067;&amp;#x304D;&amp;#x307E;&amp;#x3059;\n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. &amp;#x30FB;worker&amp;#x3059;&amp;#x306A;&amp;#x308F;&amp;#x3061;&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3082;&amp;#x306E;&amp;#x3082;&amp;#x3042;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x30BB;&amp;#x30FC;&amp;#x30D5;&amp;#x306A;Perl&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;(&amp;#x3044;&amp;#x3084;&amp;#x3001;Perl&amp;#x306B;&amp;#x9650;&amp;#x3089;&amp;#x305A;)&amp;#x306F;&amp;#x96E3;&amp;#x3057;&amp;#x3044;&amp;#x306E;&amp;#x3067;&amp;#x907F;&amp;#x3051;&amp;#x307E;&amp;#x3059;\n
  22. \n
  23. \n
  24. &amp;#x30FB;&amp;#x5358;&amp;#x306B;&amp;#x300C;&amp;#x30D5;&amp;#x30A7;&amp;#x30FC;&amp;#x30BA;&amp;#x300D;&amp;#x3068;&amp;#x3082;&amp;#x8A00;&amp;#x3044;&amp;#x307E;&amp;#x3059;\n
  25. &amp;#x30FB;&amp;#x7686;&amp;#x3055;&amp;#x3093;&amp;#x306E;&amp;#x8208;&amp;#x5473;&amp;#x306E;&amp;#x3042;&amp;#x308B;&amp;#x30EC;&amp;#x30B9;&amp;#x30DD;&amp;#x30F3;&amp;#x30B9;&amp;#x51E6;&amp;#x7406;&amp;#x3092;&amp;#x30AA;&amp;#x30EC;&amp;#x30F3;&amp;#x30B8;&amp;#x3067;&amp;#x5857;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;\n&amp;#x30FB;PerlHandler Apache::Registry &amp;#x3068;&amp;#x306F;&amp;#x30B3;&amp;#x30EC;\n
  26. &amp;#x30FB;&amp;#x51E6;&amp;#x7406;&amp;#x30D5;&amp;#x30A7;&amp;#x30FC;&amp;#x30BA;&amp;#x3092;&amp;#x4E00;&amp;#x5DE1;&amp;#x3057;&amp;#x305F;&amp;#x30EA;&amp;#x30AF;&amp;#x30A8;&amp;#x30B9;&amp;#x30C8;&amp;#x30B5;&amp;#x30A4;&amp;#x30AF;&amp;#x30EB;&amp;#x306E;&amp;#x56F3;&amp;#x3067;&amp;#x3059;\n&amp;#x30FB;&amp;#x3053;&amp;#x308C;&amp;#x306F;Apache1&amp;#x306E;&amp;#x56F3;&amp;#x306A;&amp;#x306E;&amp;#x3067;&amp;#x3001;Perl*Handler&amp;#x3067;&amp;#x306F;&amp;#x306A;&amp;#x304F;&amp;#x5F79;&amp;#x5272;&amp;#x540D;&amp;#x306E;&amp;#x82F1;&amp;#x5358;&amp;#x8A9E;&amp;#x306B;&amp;#x306A;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;\n&amp;#x30FB;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x8AAD;&amp;#x307F;&amp;#x66FF;&amp;#x3048;&amp;#x3067;&amp;#x304D;&amp;#x307E;&amp;#x3059;\n&amp;#x30FB;&amp;#x5404;&amp;#x30D5;&amp;#x30A7;&amp;#x30FC;&amp;#x30BA;&amp;#x3067;&amp;#x30A8;&amp;#x30E9;&amp;#x30FC;&amp;#x3092;return&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x3053;&amp;#x3067;response&amp;#x3092;&amp;#x3082;&amp;#x3052;&amp;#x3063;&amp;#x3066;logging&amp;#x306B;&amp;#x884C;&amp;#x304D;&amp;#x307E;&amp;#x3059;\n
  27. &amp;#x30FB;PerlHandler &amp;#x2192; PerlResponseHandler\n&amp;#x30FB;PerlResponseHandler ModPerl::Registry &amp;#x306F;&amp;#x3053;&amp;#x308C;&amp;#x3067;&amp;#x3059;\n&amp;#x30FB;PerlMapToStorageHandler &amp;#x306F; mod_perl1 &amp;#x306E; PerlTransHandler &amp;#x306E;&amp;#x4ED5;&amp;#x4E8B;&amp;#x3092;&amp;#x5206;&amp;#x696D;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306B;&amp;#x51FA;&amp;#x6765;&amp;#x305F;&amp;#x65B0;&amp;#x3057;&amp;#x3044;&amp;#x30D5;&amp;#x30A7;&amp;#x30FC;&amp;#x30BA;\n
  28. &amp;#x30FB;&amp;#x30D5;&amp;#x30A3;&amp;#x30EB;&amp;#x30BF;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x306F;&amp;#x5272;&amp;#x611B;&amp;#x3057;&amp;#x307E;&amp;#x3059;\n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. &amp;#x30FB;&amp;#x4ECA;&amp;#x56DE;&amp;#x306F;PerlProcessConnectionHandler&amp;#x306B;&amp;#x30D5;&amp;#x30A9;&amp;#x30FC;&amp;#x30AB;&amp;#x30B9;&amp;#x3092;&amp;#x5F53;&amp;#x3066;&amp;#x307E;&amp;#x3059;\n&amp;#x30FB;&amp;#x3053;&amp;#x308C;&amp;#x3089;&amp;#x3092;&amp;#x3072;&amp;#x3063;&amp;#x304F;&amp;#x308B;&amp;#x3081;&amp;#x3066;Connection&amp;#x30D5;&amp;#x30A7;&amp;#x30FC;&amp;#x30BA;&amp;#x3068;&amp;#x8A00;&amp;#x3063;&amp;#x305F;&amp;#x308A;&amp;#x3059;&amp;#x308B;&amp;#x3053;&amp;#x3068;&amp;#x3082;&amp;#x3042;&amp;#x308A;&amp;#x307E;&amp;#x3059;\n
  84. \n
  85. \n
  86. &amp;#x30FB;Apache2 Connection &amp;#x3067;&amp;#x52D5;&amp;#x304F;&amp;#x3057;&amp;#x3002;Experimental&amp;#x3060;&amp;#x3063;&amp;#x3066;&amp;#x53E4;&amp;#x3044;&amp;#x8CC7;&amp;#x6599;&amp;#x306B;&amp;#x306F;&amp;#x66F8;&amp;#x304B;&amp;#x308C;&amp;#x3066;&amp;#x3044;&amp;#x305F;&amp;#x3051;&amp;#x3069;\n&amp;#x30FB;AnyEvent&amp;#x30D9;&amp;#x30FC;&amp;#x30B9;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x306F;&amp;#x6700;&amp;#x65B0;&amp;#x306E;&amp;#x306B;&amp;#x3082;&amp;#x7121;&amp;#x3044;&amp;#x3088;&amp;#x3046;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x4F5C;&amp;#x308B;&amp;#x3068;&amp;#x9762;&amp;#x767D;&amp;#x3044;&amp;#x304B;&amp;#x3082;&amp;#x3057;&amp;#x308C;&amp;#x307E;&amp;#x305B;&amp;#x3093;&amp;#x306D;\n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n