際際滷

際際滷Share a Scribd company logo
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2O	x	mrubyで	
?はどれだけ	
侑せになれるのか	
March	4,	2017	
@i110	
Technology	Development,	
System	Management	Unit	
DeNA	Co.,	Ltd.		
YAPC::Kansai	囮嶄
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
??B初	
!? @i110	
!? 幄塀氏芙ディ`?エヌ?エ`	
!? システム云何室g_k片侭奉	
?? ?んな?が?んなことをやってる何俸	
?? 峠譲定h?め	
!? 恍定歪くらいにあれやこれやあってH2Oの_kにjoin	
!? F壓、Irgの畠てをH2Oの_kに廣いでいる彜B	
?? 恷除はmrubyまわりのC嬬弖紗Ω追討謹め	
2
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2Oについてさらっと	
3
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2Oとは	
!? https://h2o.examp1e.net/	
!? Google鍬Uいわく	
!? おおむねこの宥りです?忖何蛍を茅いて	
!? みんな?挫き蝶kazuho	sanが_k	
!? F壓の恷仟verはv2.2.0-beta1	
4	
H2Oは、硬い弊旗のWebサ`バ`と?^して、	
CPU聞?楕が詰いユ`ザ`に儻堀な鬴陲鯡畊する、	
仟しい弊旗のHTTPサ`バ`です。	
児PからOされたサ`バ`は、枠コンテンツ塘佚と	
サ`バ`プッシュを根むHTTP	/	2C嬬をフルに試?し、	
WebサイトのL宀に嗤李なUYを戻工します。
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2Oはなぜ?堀なのか	
!? 麼に3つの尖喇による	
1.? 枠業崙囮が倔	
2.? 枠M碧への鬉遼戮毅Cache-digests、TLS1.3、etc..	
3.? neatかつojのないg廾	
!? しくはWebで	
5
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
しかし´	
!? Apacheとnginxつよい	
!? 尖喇暴?	
1.? N源なモジュ`ル蛤	
2.? 秤鵑龍爐	
3.? 酢れてる業	
!? 暴は輝隼H2Oが恷?のWebサ`バ`だと佚じているので
弊順の??をより侑せにするためにH2Oが噸式してほしい	
!? 堀いことはわかった。それ參翌に採が駅勣か	
6	
hGps://w3techs.com/technologies/overview/
web_server/all
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
宴旋で酔mなWebサ`バ`へ	
!? Apacheやnginxに竃栖て、H2Oに竃栖ないことをoくしたい	
!? モジュ`ルの屁	
!? ユ`ザ`??によるモジュ`ルのきやすさ	
!? Apacheやnginxよりも、揖じことがgにできるようにしたい	
!? O協ファイルの悲さΕ謄好織咼螢謄	
!? あとドキュメントももっとg?きますすいません	
7
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Mみzみ?Zとしてのmrubyの?	
!? 2015定7?にリリ`スしたv1.4で、
Ryosuke	Matsumoto@matsumotory)	さんが兜豚g廾	
!? リクエストハンドラとしてmrubyのコ`ドをg?できる	
8
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Mみzみ?Zとしてのmrubyの?	
!? ApacheやNginxよりもいサポ`ト	
!? コアに原奉、デフォルトでON	
!? ?揖豚I/Oを辛嬬にする光Nライブラリの戻工	
!? Rack	Specにした?隼なインタ`フェ`ス	
!? 書瘁さらに?搾くしていく嚠協	
!? 覿?余	
!? アクセス崙囮、URIリライト、レスポンスのきQえ、etc..	
!? プログラマブルで悲なO協が辛嬬に	
!? サ`バ`C嬬の?Xなも辛嬬に	
9
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
mrubyの採がどう耙しいのか	
1.? サ`バC嬬の來	
2.? O協の悲來Ε謄好織咼螢謄	
10
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
1.	サ`バC嬬の來	
!? ユ`ザ??が、圀しいC嬬をさくっといて弖紗できる彜Bが尖	
!? しかしcでモジュ`ル恬るのは?	
!? Cloudbleed	(2017)	
!? https://blog.cloud?are.com/incident-report-on-memory-leak-caused-by-cloud?are-
parser-bug/	
!? Cloud?are	(CDN)でk?したユ`ザ蜘停秤鵑梁えい}	
!? 圻咀は、坪uのnginxモジュ`ルHTMLパ`サのバグ	
!? ポインタ砿尖のミスによるバッファオ`バ`ラン	
!? mrubyでけば圻尖議にk?しえない}	
!? コ`ドにバグがあっても、バッファオ`バ`ランがk?することはない	
11
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
2.	O協の悲來Ε謄好織咼螢謄	
!? ?議なにはなりますが、Apacheやnginxのディレクティブを
?俳えられないえるつもりもないので
飴悒稀`バ`?てるたびに2rgくらいぐぐっている	
!? 俔なmod_rewrite、
ミスりやすいアクセス崙囮、
採絞か燭ないsection´	
!? 尖	
!? シンプルなことはディレクティブでgに	
!? }jなことはプログラマブルにがっつり	
12
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
なんとなく咫鵑?崑する歌深	
!? ?^	
!? Excel	not	working:														1,170嵐周	
!? PowerPoint	not	working:						1,040嵐周	
!? nginx	con?g	not	working:									73嵐周	
!? nginxはユ`ザ`の??盾Q嬬?が?いというのもありそう	
13
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
2.	O協の悲來Ε謄好織咼螢謄	
!? ディレクティブによるO協だと、O協がちゃんと燭い討い襪
gHにリクエストを僕ってしてみるしかない	
!? O協弖紗したらCon?ictしてeのw侭が咾なくなった,箸´	
!? }jであるからこそテストをきたいのに´	
!? mrubyならテストをける	
!? 腺業のかいg悶テスト	
!? スタブを聞ったテスト	
!? etc..	
!? 除?嶄に採かしらのHowToを巷_します┐燭屬鵤	
14
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
というわけで、云?は	
!? H2O	x	mruby	の碧Mみのgな盾h	
!? 岑られざるC嬬のB初	
!? ステルスで弖紗したC嬬	
!? 除?マ`ジ嚠協のC嬬	
15
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2O	x	mruby	古h	
16
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2Oのア`キテクチャ	
!? マルチスレッド	x	イベントル`プ	
!? デフォルトでコア方と揖じ方のスレッドが軟	
!? 光スレッドがイベントl咾妊螢エストを案く	
!? 翌何I/Oによるブロックはスル`プットに岷Yするので、
畠てのI/OjみのI尖をノンブロッキングで?うことが故勣	
17
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
mruby嶄のI尖もノンブロッキングでやりたい	
!? 採も深えずに屡贋のmrbgemsを聞うとgにブロックする	
!? イベントル`プ鬉気譴深抜mrbgemsはほとんどoい	
!? 蒙にh2oでは鏡?の?堀な。イベントル`プを聞っており、
箭えばlibuv鬉mrbgemsがあっても噸宥には聞えない	
!? CにもAnyEventみたいなレイヤがあればいいんですけどね	
!? H2O	x	mruby	ではイベントl咾龍{を鞭けられないのか	
18
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
それFiberでできるよ	
!? Fiber:	Rubyにおけるコル`チン@Af{議マルチタスク	
!? Perlでいうと´なんでしょうねCoro殖聞ったことない	
19
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
FiberによるノンブロッキングI/O	
20
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
FiberによるノンブロッキングI/O	
!? gHのH2Oのコ`ド	
!? https://github.com/h2o/h2o/blob/master/lib/
handler/mruby/embedded/core.rb#L51	
!? O協ファイルから誼たmrubyハンドラの
コ`ドを、Fiber	RunnerにQ	
!? 恷m晒のため、?た?がそこそこ伽い	
!? 恬撹したFiberの壅旋?	
!? begin-rescueのオ`バ`ヘッド指閲	
!? ちなみにv2.3からはもっと伽い湖じにな
ります	
21
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Rack	ApplicaIon	としての	mrubyハンドラ	
!? Rack碧にtったRackアプリケ`ションとして┐曚棕峰辛嬬	
!? v2.2參念はレスポンスのきQえが音辛だが、v2.3參週で竃栖るように
なる嚠協	
22
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Rack	ApplicaIon	としての	mrubyハンドラ	
!? mrubyコ`ドを翌何ファイルに崔くことも齢辛嬬	
!? Rack	Middleware議なことも齢辛嬬	
!? そのうちRack::Builder札QのDSLも恬りたい	
23
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
H2O	x	mruby	で	
あれやこれやできるよという	
24
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	
25
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	
!? v2.1から、aclというMみzみメソッドを?吭	
!? アクセス崙囮がgにけるように	
!? サンプルケ`ス	
!? 127.0.0.1からのアクセスは械にS辛	
!? 192.168.*參翌からのcurlは403	
!? 蒙協のipからのリクエストには503	
!? ^moved ̄	が根まれるパスへのリクエストは蒙協URLにリダイレクト	
!? /admin/	參和へのリクエストにはBasicJ^を勣箔	
26
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	-		nginxの栽	
!? 謹蛍こんな湖じ	
!? つれぇ´	
!? Ifの訳周嶄で、andやorが聞
えないしネストもできない	
!? 篳聞ってうまいこと
やりくり´	
!? そもそも巷塀がif	is	evilと?
っている庁´採だと´	
!? https://www.nginx.com/
resources/wiki/start/topics/
depth/i?sevil/	
27	
少御:	そんなにちゃんと嘛_Jしてないので歌深にしないで和さい
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	-		Apacheの栽	
!? Wの詰いApache?では音辛嬬でした	
!? 屎岷にいうと{べる櫃眛陲ませんでした	
28
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	-		H2O	2.0參念の栽	
!? うっこわい	
!? まぁやりたいことが殆岷にできはするし、iめもする	
!? しかしもうちょっとなんとかならないものか	
29
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Access	Control	-		H2O	2.1參週	
!? なんとなくエレガントにけるようになった	
!? aclブロックの嶄では光NDSLメソッドが聞える	
!? allow:	軸恙に瘁Aのハンドラにpass	through	
!? deny:	軸恙に403	
!? etc..	
!? 光メソッドのブロック坪では、m?訳周を挫きにける	
!? ここでもaddrやpathなど、envにアクセスするための
DSLメソッドが聞える	
30
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
DoS	DetecIon	
31
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
DoS	DetecIon	
!? 覆DoSDetectorというライブラリを戻工	
!? IPアドレスベ`スでg了rg坪のリクエスト方をカウントし、
階えたら?協豚gBANする	(403	Forbidden)	
!? Apacheのmod_dosdetectorに犁	
!? https://github.com/stanaka/mod_dosdetector	
!? ロジックも歌深にさせてきました	
32
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
DoS	DetecIon	-	Advanced	
!? DoS登協rのI尖はcallbackでカスタマイズ辛嬬	
!? ログ預いたりアラ`トメ`ル?ばしたり	
!? strategyを?恬すれば、DoS登協ロジックもカスタマイズ辛嬬	
33
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
DoS	DetecIon	C	もろもろ	
!? 廣吭泣	
!? F壓のg廾は、スレッドg了のロ`カル篳でカウントしているの
で、、鬟曠好畔〜スレッド方で護り麻する駅勣がある	
!? v2.3あたりから、mrubyからRedisが聞えるようになる嚠協瘁
峰なので、そういったstrategyを?吭する嚠協がなくはない	
!? Pure	mrubyでかれているため、モジュ`ル?恬したいユ`ザ`さんの
サンプルとして措いのでは	
!? なおPure	mrubyコ`ドならgにrequireするだけでよく、
H2Oの壅ビルドは音勣	
!? c吉を聞ってmrbgemsをきたい栽は、mrubyとh2oをビルドし
なおす駅勣あり	
!? ?議にはjoin兜?にいたやつなので房い?れがある
?蛍で聞ってないけど	
34
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	
35
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	
!? mrubyハンドラからノンブロッキングなHTTP	Requestが?ばせる	
!? proxy議なことが否叟にできる	
!? 2粁Aの揖豚ポイント	
!? req.joinしてステ`タスとヘッダのみを函誼	
!? resp[2].joinしてボディを函誼	
36
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭1	
!? 軟rにetcdからO協、鯣ゝ辰垢襯汽鵐廛襭v2.3?	
!? Y創からは福いたけど、このハンドラの翌箸?揖豚I尖させるや
つ?笋世辰燭鵑任垢茵しくはWebで´	
!? 剃にいうと書はハンドラの翌ではhttp_requestとか聞えないので
お櫃鬚弔穎造気	
37
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭2	
!? }方リクエストを揖rに誘げて、Y栽して卦すサンプル	
38
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭2	-	もっと紳覆茲	
!? こんな?にすると、より壼くレスポンスのパイプラインにdせられる	
!? メモリフットプリントも?さくなる╋犒孱	
39
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭3	
!? ESI	(Edge	Side	Includes)	のサンプル	
!? ちなみにESIとは	
!? エッジサ`バe.g.	CDN箸如
啜弔縫灰鵐謄鵐弔鮟Mみ?てるためのマ`クアップ碧┳硬い	
!? ペ`ジを撹する何瞳ごとにキャッシュできる	
40
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭3	
!? m輝にこんなの恬って´	
41	
<esi:include>タグの	
src奉來をiき竃して	
HTTPリクエストを僕佚	
bodyを鞭佚┐箸いΔ揖豚
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
HTTP	Request	-	箭3	
!? こう	
!? シンプルに?えるが、このC嬬をcでg廾することをご誅駭造気ぁ	
42
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Redis	
43
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Redis	
!? v2.2から、TLS	Session	Resumptionのバックエンドとして聞うため、
ネイティブでredisサポ`トしてます	
!? ID	basedの栽坤ャッシュの隠砿侭として	
!? ticket	basedの栽坤船吋奪箸留9侭として	
!? ちなみにauto	rotateC嬬原き	
!? 2.1參念はmemcachedだけだった	
!? HiRedisをラップしてh2oコアに隔ってる	
!? v2.3參週	
!? そのredisライブラリをmrubyからもQえるようにした
H2O::Redisがリリ`ス嚠協	
!? キャッシュをredisから函ってきて卦抜する、みたいなI尖を
mrubyで?うことが辛嬬に	
44
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Redis:	箭	
!? 床議なペ`ジのHTTPレスポンスをまるっとredisにキャッシュする箭	
45
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Other	TCP	Bindings	
46
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Other	TCP	Bindings	
!? HTTPやRedisやコア箸g廾がすでにあったからそれを聞えばよかった	
!? でも書瘁、麿のプロトコルを聞いたい栽吉はどうする	
!? MySQL,	memcached,	etc..	
!? eにcでプロトコルバインディングをg廾してくのはしんどい	
47
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Other	TCP	Bindings	
!? ノンブロッキングなH2O::TCPSocketを恬った	
!? eのバインディングは、mrubyでこれを聞いつつけばよい	
!? ので、?械にきやすくなったはず	
!? mrubyのパフォ`マンスが}になることは
ほとんどoいだろう覿	
!? とりあえずMySQLでもいてみる嚠協嚠協は隆協	
48
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Image	Filter	
49
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Image	Filter	
!? k燕l嚔_kで、書?までになんとかそれっぽいもの恬ろうと房ってた
んですけど、gに栽いませんでした´	
!? いちおう書瘁こんなことも深えてますよ、議なノリでB初させて和さい	
!? 麼崋	
!? mod_small_light議な、鮫颪鬟ンザフライでs?やクリップして
くれるやつが圀しい	
!? 送?にmrubyで鮫I尖をするのはWいだろう	
!? 翌何コマンドg?できたらよいのでは	
!? それ參翌にも竃栖ることの嫌がレがるし	
50
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
ベンチマ`ク	
51
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
ベンチマ`ク	
!? ?したいこと	
!? mrubyであれこれやっても、システムのボトルネックはどうせ
I/Oもしくはアプリケ`ションなので、}にならないはず	
!? 揖じI尖をするnginxと?^して`餓レベルの喪晒しかないはず	
!? サンプルアプリ	
!? gなTODOリストみたいなやつのJSON	API	
!? https://github.com/i110/tinytodo	
!? O協ファイルやwrk	scriptも?ってます	
52
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
ベンチマ`ク撹	
53	
!? 編^h廠	
!? EC2|奨リ`ジョン	c4-8xlarge	3岬	(尖コア方36	
!? リバ`スプロキシH2O	or	nginx	
!? アプリケ`ションサ`バ	(Plack	app	
!? 塞かけサ`バwrk	with	lua	scripting	
!? 揖?プレイスメントグル`プ、ネットワ`キング嗤	
塞かけ	
サ`バ	
revproxy	
(H2O	or	nginx)	
クソアプリ	
塞	 proxy	
sqlite
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
並念ベンチマ`ク	
54	
!? ベンチ函る念にまず、H2O	x	mrubyとnginxのな來嬬餓を{べよう	
!? アプリiきで、それぞれが岷俊200卦してみる	
!? mrubyぶんのoverheadのせいでnginxのほうが堀い覿	
塞かけ	
サ`バ	
revproxy	
(H2O	or	nginx)	
クソアプリ	
塞	
sqlite	基o?で	
200
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
並念ベンチマ`ク	C	Y惚	
55	
!? このr泣でH2Oのほうが堀いんですけど´まじで´	
!? クソアプリいらなかったわ´	
Requests	per	second
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
ベンチマ`ク:	深賀	
!? よくわからない	
!? まぁnginxもごにょごにょきすぎるとWくなるということですかね	
!? とにかく?拈でよかった	
!? 富なくともほとんどのユ`スケ`スでは、mrubyであれこれやっても
}ないと?えるのではないか	
56
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Y	
57
Copyright	?	DeNA	Co.,Ltd.	All	Rights	Reserved.	
Y	
!? H2O	x	mrubyでみんなで侑せになろう	
!? つらみのあるO協ファイルとはさよならしよう	
!? ?喇にサ`バをしていこう	
!? gにC嬬をけるので頁?いてみてください	
!? ブログにいたりgithubで巷_してくれる吉すると?粭劼靴い任	
!? Feature	requestしてくれるだけでも?粭劼靴い任	
!? ??なC嬬Ω追討?る嚠協のv2.3にご豚棋和さい	
!? むしろコアまわりのPRもお棋ちしております	
58

More Related Content

H2O x mrubyで繁はどれだけ侑せになれるのか