apacheの展望とmod_perlの超絶技巧 #yapcasia

53
Apacheの展望と mod_perlの超絶技巧 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2013/9/20 YAPC::Asia Tokyo 2013

Upload: tetsuji-ogata

Post on 15-Jan-2015

3.964 views

Category:

Technology


1 download

DESCRIPTION

2013/09/20 YAPC::Asia Tokyo 2013 で発表したトーク資料です。

TRANSCRIPT

Page 1: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apacheの展望とmod_perlの超絶技巧

尾形 鉄次 (OGATA Tetsuji)

Twitter: @xtetsuji2013/9/20 YAPC::Asia Tokyo 2013

Page 2: Apacheの展望とmod_perlの超絶技巧 #yapcasia

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.

Page 3: Apacheの展望とmod_perlの超絶技巧 #yapcasia

自己紹介• 尾形 鉄次 (OGATA Tetsuji)

• Twitter: @xtetsuji

• Blog: http://post.tetsuji.jp/

• SlideShare: http://www.slideshare.net/xtetsuji

• PAUSE: OGATA

• GitHub, Twitter, etc.: xtetsuji

Page 4: Apacheの展望とmod_perlの超絶技巧 #yapcasia

自己紹介

http://tech.fonfun.co.jp/

Page 5: Apacheの展望とmod_perlの超絶技巧 #yapcasia

YAPC::Asia Tokyo 2012

• 「モダンmod_perl入門」発表

• 昨年がmod_perlの入門と実践であったなら、今年は哲学と展望が主題

• 今後のApache HTTP Serverはどうなる?

• mod_perlの未来はどうなる?

Page 6: Apacheの展望とmod_perlの超絶技巧 #yapcasia

そんなことは言わせないぞ!

Page 7: Apacheの展望とmod_perlの超絶技巧 #yapcasia

I. Apacheの展望

Page 8: Apacheの展望とmod_perlの超絶技巧 #yapcasia

他のサーバとの競争

• NginxやPerl製ウェブサーバの台頭

• しばらくはApache優勢の見込み

• mod_perlが優勢かは別として、今後もデプロイ環境として残っていくはず

Page 9: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Netcraftのデータより

http://news.netcraft.com/archives/2013/09/05/september-2013-web-server-survey.html より

Page 10: Apacheの展望とmod_perlの超絶技巧 #yapcasia

根強いApache信仰• 受託現場に多く残る根強いApache信仰

• 今後数年はApacheへの信仰は揺らがないだろう

• Apacheのシェアを食っているのはNginx

ではなくIISのほうが大きいのは意外

Page 11: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apache/mod_perlが抱える問題

• mod_perl2がApache2.4に未だに対応していない問題

• Windowsでのサポートに苦慮している

• Upstreamでは活発な開発が続けられているので、もうすぐリリースか?

Page 12: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apache2.2にロックされたディストロパッケージ• DebianやUbuntu stable等のLinuxディストリビューションのapache2パッケージは2.2がほとんど (Debian sid=jessieは2.4)

• Apache2.4.1は2012年2月リリース

• mod_perl2にロックされている説

Page 13: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apache prefork MPMの頭打ち問題(C10K問題)

Page 14: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apacheの次の一手• Apache2.6

• Apache2.5として現在開発中、Apache

APIの大きな変更は無い見込み

• event MPMの成熟に期待

• Apache3.0

• Apache2.0当時(2007年)から宣言されていたが出てくる気配がない

Page 15: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apache3.0?

• Apache2.0登場当時から言われている

• Apacheコア開発者の構想段階なのか

• Apache APIの大胆な刷新を宣言している

• mod_perl1→mod_perl2のようなある種の「断絶」を経験するかもしれない

Page 16: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの利便性

• Nginx&Perl製ウェブサーバ全盛時代でもmod_perlの利便性はある

• 例えば大量のplackupがあるサーバでのポート番号管理問題

Page 17: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの利便性ogata@languedechat:~/apps$ jobs[1] Running plackup -s Starlet --port=4001 app01.psgi &[2] Running plackup -s Starlet --port=4002 app02.psgi &[3] Running plackup -s Starlet --port=4003 app03.psgi &[4] Running plackup -s Starlet --port=4004 app04.psgi &[5] Running plackup -s Starlet --port=4005 app05.psgi &[6] Running plackup -s Starlet --port=4006 app06.psgi &[7] Running plackup -s Starlet --port=4007 app07.psgi &[8] Running plackup -s Starlet --port=4008 app08.psgi &[9] Running plackup -s Starlet --port=4009 app09.psgi &[10] Running plackup -s Starlet --port=4010 app10.psgi &[11] Running plackup -s Starlet --port=4011 app11.psgi &[12] Running plackup -s Starlet --port=4012 app12.psgi &[13] Running plackup -s Starlet --port=4013 app13.psgi &[14] Running plackup -s Starlet --port=4014 app14.psgi &[15] Running plackup -s Starlet --port=4015 app15.psgi &[16] Running plackup -s Starlet --port=4016 app16.psgi &[17] Running plackup -s Starlet --port=4017 app17.psgi &[18] Running plackup -s Starlet --port=4018 app18.psgi &[19]- Running plackup -s Starlet --port=4019 app19.psgi &[20]+ Running plackup -s Starlet --port=4020 app20.psgi &

Page 18: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの利便性<VirtualHost *:80> ServerName example.jp DocumentRoot /path/to/sites/example.jp ErrorLog /var/log/apache2/example.jp/error.log CustomLog /var/log/apache2/example.jp/access.log combined <Location /app01> SetHandler perl-script PerlResponseHandler Plack::Handler::Apache2 PerlSetVar psgi_app /path/to/apps/app01.psgi </Location> <Location /app02> SetHandler perl-script PerlResponseHandler Plack::Handler::Apache2 PerlSetVar psgi_app /path/to/apps/app02.psgi </Location> ...</VirtualHost>

Page 19: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの利便性• Copy on Write(CoW)が働く

• app.psgiとパス・VirtualHostが対応するので管理しやすい

• Apache/mod_perlの堅牢性に依存できる(+Plack::Handler::Apache2)

Page 20: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの情報収集• 公式Subversionリポジトリ

• 公式メーリングリストhttp://mail-archives.apache.org/mod_mbox/perl-modperl/

• Nabbleのmod_perlフォーラムhttp://old.nabble.com/mod_perl-f183.html

• 書籍「mod_perl2 User’s Guide」

Page 21: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perlの情報収集• 日本語の情報は Twitter @mod_perl_info

で時々流れている (私が中の人です)

• http://modperl.info/ というサイトを作ろうとしてまだ出来ていません

• その他、日本語のmod_perl最新情報は無いようなものなので出していきたい

Page 22: Apacheの展望とmod_perlの超絶技巧 #yapcasia

今後のmod_perl開発• mod_perlハンドラを直接書いたりといった場面は徐々に減っていくだろう

• PSGIアプリデプロイの選択肢としては根強いApache信仰の元、生き残りそう

• 「Registry」によるPerl CGIの実行環境としては優秀、レガシー資源の拠り所

Page 23: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Intermezzo.「もうひとつの」本当にあったレガシーな話

Page 24: Apacheの展望とmod_perlの超絶技巧 #yapcasia

とあるレガシーな話• リモートメール http://rmail.jp/

• 1999年から運用開始、2003年に大改修

• 商用環境30万行弱のPerlソースコード

• 数年前mod_perl1→2への移行を行ったが、直接APIを叩いている一部分の移行が大変だった

Page 25: Apacheの展望とmod_perlの超絶技巧 #yapcasia

とあるレガシーな話• mod_perl APIを直接叩いている場合の

mod_perl1→2移行コストは結構かかる

• mod_perl1を使っている場合の戦略

• CGI高速化のみなら簡単に2へ行ける

• mod_perl2へ行くか別の道へ行くか

Page 26: Apacheの展望とmod_perlの超絶技巧 #yapcasia

とあるレガシーな話• OEM等の受託納品型の仕事もあるので新しいものへの冒険がしづらい

• 人が少ない、動くもの触らずの法則

• 新しく作った大きな機能はmod_perlを直接叩くものであれば別サーバにして同じネットワーク内でHTTP API化する

Page 27: Apacheの展望とmod_perlの超絶技巧 #yapcasia

とあるレガシーな話• mod_perl2いいよね!という社内合意は得つつも、情勢に合わせてPSGIやNode

を導入する考えもある

• WAFは使用していないがCGI.pmの自社継承モジュールが中心にあって、これをPSGIに差し替える長期的計画もある

Page 28: Apacheの展望とmod_perlの超絶技巧 #yapcasia

II. mod_perlの超絶技巧

Page 29: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Echo Server

• Echo Serverが書ければ何でも書けそう

• とりあえず書いてみる

• Apache2/mod_perl2のConnection APIにはSocketとBucket Brigadeという2種類があるが、簡単なSocketのほうで試す

Page 30: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Echo Serverpackage MyApache2::EchoServer;# PerlProcessConnectionHandler MyApache2::EchoServeruse strict;use warnings;

use Apache2::Connection ();use APR::Socket ();

use Apache2::Const -compile => qw(OK);use APR::Const -compile => qw(SO_NONBLOCK);use constant BUFF_LEN => 1024 * 4;

sub handler { my $c = shift; my $sock = $c->client_socket; $sock->opt_set(APR::Const::SO_NONBLOCK => 0); while ( $sock->recv(my $buff, BUFF_LEN) ) { last if $buff =~ /^[\r\n]+$/; $sock->send($buff); } return Apache2::Const::OK;}1;

Listen 9000<VirtualHost *:9000> PerlModule MyApache2::EchoServer PerlProcessConnectionHandler MyApache2::EchoServer</VirtualHost>

Page 31: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Echo Server

• 長いか分からないけど、何か難しい

• 受託現場で「AnyEvent…」って言って「訳の分からない物はダメです」って言われなければAnyEventで書いたほうが簡単に書けそうな気もする

• AnyEvent版はどんな感じ?

Page 32: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Echo Server (AnyEvent)#!/usr/bin/env perluse strict;use warnings;

use AnyEvent;use AnyEvent::Socket qw(tcp_server);use AnyEvent::Handle;

use constant PORT => 9000;

my $cv = AnyEvnet->condvar;

my $echo_server = tcp_server undef, PORT, sub { my $fh = shift; my $hdl; $hdl = AnyEvent::Handle->new( fh => $fh, on_read => sub { $hdl->push_write(delete $hdl->{rbuf}); }, );};

$cv->recv;

Page 33: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Two Echo Servers

• AnyEvent版の方が若干シンプルか?

• Apache版のほうは多少複雑だけど、Apacheと同じ堅牢さを持つと言える

• AnyEventの堅牢さをどう評価するか

• 学習コストと対価の問題

Page 34: Apacheの展望とmod_perlの超絶技巧 #yapcasia

SMTP Server

• qpsmtpd (http://smtpd.github.io/qpsmtpd/) が大いに参考になるし、これの再発明は大変そうだ

• Apache::SMTPというCPANモジュールは闇バージョン「mod_perl1.99」の産物

• 「mod_perl1.99」は使ってはいけない

Page 35: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Apache::Qpsmtpdpackage Apache::Qpsmtpd;

use 5.006001;use strict;use warnings FATAL => 'all';

use Apache2::ServerUtil ();use Apache2::Connection ();use Apache2::Const -compile => qw(OK MODE_GETLINE);use APR::Const -compile => qw(SO_NONBLOCK EOF SUCCESS);use APR::Error ();use APR::Brigade ();use APR::Bucket ();use APR::Socket ();use Apache2::Filter ();use ModPerl::Util ();

our $VERSION = '0.02';

sub handler { my Apache2::Connection $c = shift; $c->client_socket->opt_set(APR::Const::SO_NONBLOCK => 0);

die "\$ENV{QPSMTPD_CONFIG} must be given" unless $ENV{QPSMTPD_CONFIG};

my $qpsmtpd = Qpsmtpd::Apache->new(); $qpsmtpd->start_connection( ip => $c->remote_ip, host => $c->remote_host, info => undef, conn => $c, );

$qpsmtpd->run($c); $qpsmtpd->run_hooks("post-connection"); $qpsmtpd->connection->reset;

return Apache2::Const::OK;}...

Page 36: Apacheの展望とmod_perlの超絶技巧 #yapcasia

qpsmtpd

• qpsmtpdはPerl製のSMTPサーバだけど、mod_perl以外でも実行が可能

• tcpserver(inetd/xinetd), async(Danga::Socket), forkserver, prefork

• プラグインもPerlで書ける

• シンプルだけど並列性等の実績も多数

Page 37: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perl Router

• mod_perlのHTTPハンドラはリクエストとレスポンスの良い抽象化

• $r (Apache2::RequestRec object)

• フレームワークが言うControllerの良い先例の一つ

Page 38: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perl Router

• 以前 Hokkaido.pm の LT で書いたものがGistに残っていた https://gist.github.com/

xtetsuji/3207493

• これは一から書いたもので不完全だしもっとモダンに書けないものか

• そもそもLTの一発ネタでしかないし

Page 39: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perl Router

• ModPerl::Router として Router::Simple を使って書きなおしてみた

• https://github.com/xtetsuji/p5-ModPerl-Router

• PSGIの$envをRouter::Simple用に作る

• GitHub止まりだし、テストも不十分

Page 40: Apacheの展望とmod_perlの超絶技巧 #yapcasia

mod_perl Routerpackage MyApache2::Sample1;# SetHandler perl-script# PerlResponseHandler MyApache2::Sample1

use strict;use warnings;

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

sub handler { # $r is Apache2::RequestRec object my $r = shift; if ( uc $r->method eq 'GET' && $r->uri eq '/foo' ) { ...; return Apache2::Const::OK; } elsif ( ... ) { ...; }}1;

package MyApache2::Sample2;# SetHandler perl-script# PerlResponseHandler MyApache2::Sample2

use strict;use warnings;

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

use ModPerl::Router;

get '/foo' => sub { # $r is Apache2::RequestRec object my $r = shift; ...; return Apache2::Const::OK;};...;1;

before after

Page 41: Apacheの展望とmod_perlの超絶技巧 #yapcasia

KVS / memcached

• Apache2/mod_perl2 で memcached???

• preforkとthreadのハイブリッドMPMのworker MPMの最大プロセスを1にしてPerlのithreadを使って変数共有

• mod_perl2でConnectionフェーズを書く

Page 42: Apacheの展望とmod_perlの超絶技巧 #yapcasia

KVS / memcached<IfModule worker.c> StartServers 1 MaxClients 64 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 64 MaxRequestsPerChild 0

ServerLimit 1

PerlInterpStart 1 PerlInterpMax 1 PerlInterpMinSpare 1 PerlInterpMaxSpare 1 PerlInterpMaxRequests 2</IfModule>

ogata@sid:/etc/apache2$ ps aux | grep "/usr/sbin/apache[2]" root 28935 0.0 0.9 80888 4608 ? Ss 23:56 0:00 /usr/sbin/apache2 -k startwww-data 28938 0.0 0.7 690016 3992 ? Sl 23:56 0:00 /usr/sbin/apache2 -k start

Page 43: Apacheの展望とmod_perlの超絶技巧 #yapcasia

(ヽ´ω`)

Page 44: Apacheの展望とmod_perlの超絶技巧 #yapcasia

KVS / memcached

• 作成途中だったのですが、時間切れでまだ出来ていません m(__)m

• ModPerl::Memcached という名前で近いうちにGitHubに上げられる…はず!

• HTTP KVS APIはmod_perl開発経験ありだったんですけど

Page 45: Apacheの展望とmod_perlの超絶技巧 #yapcasia

誰得なんですか?• 受託現場等で「memcached? ( ゚Д゚)ハァ?」と言われれるケースは今も無くはない

• でも「Apacheです( ー`дー´)キリッ」と言っておけばOKな場合がある (∩´∀`)∩ワーイ

• 多様な実装例としても面白い

Page 46: Apacheの展望とmod_perlの超絶技巧 #yapcasia

こんなのもやりたい

• DNS (qpsmtpd的コンセプト) bindの代替

• POP3/IMAP4

• WebSocket → PocketIO, Mojolicious

• SPDY HTTP/2.0 → Apache側が対応する?

• その他、夢が広がるApacheのサーバ!

Page 47: Apacheの展望とmod_perlの超絶技巧 #yapcasia

おわび• 超絶技巧成分が足りなくてすみません

• 応募時タイトルを大仰にしてしまった

• これからの活躍にご期待ください!

• GitHub: xtetsuji

• Twitter: @xtetsuji / @mod_perl_info

Page 48: Apacheの展望とmod_perlの超絶技巧 #yapcasia

III. まとめ

Page 49: Apacheの展望とmod_perlの超絶技巧 #yapcasia

まとめ(1/3)

• mod_perlの学習コストは他のサーバと同じくらいでApacheの信頼性に依れる

• 今なら、書ける状況であればAnyEvent

でサーバを書いたほうが汎用性があるという意見には賛成

Page 50: Apacheの展望とmod_perlの超絶技巧 #yapcasia

まとめ(2/3)

• Apache2.4問題の解決がいつになるか、またevent MPMとの応用はどうなるか

• Apache2.6は開発中であるがApache2 API

は変わらない

• Apache3.0という幻が具現化したとき、APIを断絶するか?

Page 51: Apacheの展望とmod_perlの超絶技巧 #yapcasia

まとめ(3/3)

• 受託現場等で「新しいもの」が受け入れられない場合、根強いApache信仰を利用するmod_perl2開発はオイシイ

• Apacheが培った堅牢性、その上に乗ることができるAPIを使わない手は無い

Page 52: Apacheの展望とmod_perlの超絶技巧 #yapcasia

Timeup?

• 実は個人的には商用環境ではmod_perl

の直接の使用を徐々に減らしている

• とはいえmod_perlは面白い教材なので今後は色々なレガシーに困っている人のためにmod_perlを研究していきたい

• Do you have any questions?

Page 53: Apacheの展望とmod_perlの超絶技巧 #yapcasia

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