mrubyで振る舞いを記述可能な高速に動作するHTTP/2 Webサーバ
5SVTUFSENSVCZͰৼΔ͍Λهड़Մೳͳߴʹಈ࡞͢Δ)5518FCαʔόদຊ྄հ
View Slide
࣍• 5SVTUFSEͷಛ• 3VCZΛద༻ͨ͠Օॴ• 3VCZΛ׆༻ͨ͜͠ͱʹΑΔޮՌ• ࣾձʹٴ΅͢Өڹ第7回フクオカRuby大賞 本審査 2
5SVTUFSEͷಛ第7回フクオカRuby大賞 本審査 3
5SVTUFSE• )5518FCαʔό• 3VCZͰઃఆ͕ॻ͚Δ• 3VCZͰػೳ֦ுͰ͖Δ• αʔόػೳΛΞϓϦʹࠐΈՄೳ• ඇৗʹߴʹಈ࡞͢Δ第7回フクオカRuby大賞 本審査 4
ߴʢ݄ݱࡏʣHTTP/2 Server \ size of content 6 bytes 4,096 bytes ngh)pd(single thread) 148,841 73,812 ngh)pd(mul= thread) 347,152 104,244 =ny-‐ngh)pd(single thread) 190,223 82,047 trusterd(single thread) 204,769 92,068 trusterd(mul= process) 509,059 134,542 H2O(single thread) 216,453 112,356 H2O(mul= thread) 379,623 146,343 第7回フクオカRuby大賞 本審査 5 HTTP/1 Server \ size of content 6 bytes 4,096 bytes nginx(single thread) 21,708 22,366 nginx(mul= process) 67,349 56,203 ࢀߟɿಉڥͷ)551ͷ݁Ռɹ※ https://github.com/matsumoto-r/trusterd#benchmarks
։ൃͷܦҢ• աڈʹNPE@NSVCZOHY@NSVCZΛ։ൃ– ߴɾলϝϞϦʹ8FCαʔόΛػೳ֦ு– 3VCZͰ͋ΔఔৼΔ͍Λهड़Մೳ– ಈతͳઃఆɾ֦ுΛ3VCZͰهड़Մೳ• NPE@NSVCZOHY@NSVCZͷଥڠ– ੑೳ͕"QBDIFOHJOYʹґଘ– ઃఆͷ֦ு࣮͕Ϟδϡʔϧ༷ʹґଘ– ݁ہຊମͷઃఆ͔ΒಀΕΒΕͳ͍ɾࠞࡏ第7回フクオカRuby大賞 本審査 6
͔Β࡞Ζ͏• ޙΛݟӽͯ͠• Ͳ͏ͤͳΒ)5518FCαʔό• શͯͷઃఆ֦ுΛ3VCZͰॻ͚Δ• NSVCZʹ࠷దԽ͞Εͨ8FCαʔό• ػೳͷͱଞΞϓϦͷࠐΈ第7回フクオカRuby大賞 本審査 7
3VCZΛద༻ͨ͠Օॴ第7回フクオカRuby大賞 本審査 8
5SVTUFSE• )5518FCαʔό• 3VCZͰઃఆ͕ॻ͚Δ• 3VCZͰػೳ֦ுͰ͖Δ• αʔόػೳΛΞϓϦʹࠐΈՄೳ• ඇৗʹߴʹಈ࡞͢Δ第7回フクオカRuby大賞 本審査 9
3VCZͰઃఆ͕ॻ͚Δ第7回フクオカRuby大賞 本審査 10 root_dir = "/usr/local/trusterd"s = HTTP2::Server.new({:port => 8080,:document_root => “#{root_dir}/htdocs”,:server_name => “Trusterd/0.0.1”,:tls => false,:worker => “auto”,})s.run
3VCZͰػೳ֦ுͰ͖Δ第7回フクオカRuby大賞 本審査 11 s.set_map_to_strage_cb {if s.r.uri == ”/”s.r.filename = "#{root_dir}/index.html”endif s.r.uri =~ /^.*\.rb$/s.enable_mrubyfi}s.set_content_cb {s.r.rputs "hello trusterd world from cb”}
3VCZͰػೳ֦ுͰ͖Δ第7回フクオカRuby大賞 本審査 12 f = File.open "#{root_dir}/logs/access.log", "a"s.set_logging_cb {f.write "client_ip:'#{s.conn.client_ip}'date:'#{s.r.date}' status:#{s.r.status}content_length:#{s.r.content_length}uri:'#{s.r.uri}' filename:'#{s.r.filename}'user_agent:'#{s.r.user_agent}'\n"}s.set_access_check_cb {s.r.set_status 403 if deny}
3VCZͰػೳ֦ுͰ͖Δ第7回フクオカRuby大賞 本審査 13 s.set_map_to_strage_cb {# Experiment: reverse proxy# client <=HTTP/2=> trusterd <=HTTP/1=> Upstreamif s.r.uri == /^/upstream(¥/.*)/s.upstream_uri = $1s.upstream = “http://127.0.0.1:8081”end}
αʔόػೳΛΞϓϦʹࠐΈ• NSVCZIUUQͱͯ͠Մೳ• NSVCZܦ༝ͰࠐΈՄೳ• ϛυϧΣΞΞϓϦͰ)551௨৴• NSVCZͷࡌΔσόΠεͰ)551௨৴第7回フクオカRuby大賞 本審査 14
3VCZΛ׆༻ͨ͜͠ͱʹΑΔޮՌ第7回フクオカRuby大賞 本審査 15
ߴ͍ϨϕϧͰੜ࢈ੑͱੑೳͷཱ྆• ैདྷͷಠࣗઃఆॻ͖ʹ͔ͬͨ͘– ੩తͳઃఆʹͳΓ͕ͪ– ಠࣗ%4-͍ʹ͍͘– ࠓޙͷ8FCαʔϏεͷߴԽʹ͍͚ͳ͍• NSVCZͰ౷Ұతʹಈతͳઃఆهड़– )551ΛΞϓϦσόΠεʹࠐΊΔ– ຊମ$ݴޠͰ࣮͓ͯ͠Γඇৗʹߴ– ઃఆͷ3VCZԽ͕࣮͍͢͠ɾअຐ͠ͳ͍第7回フクオカRuby大賞 本審査 16
ࣾձʹٴ΅͢Өڹ第7回フクオカRuby大賞 本審査 17
NSVCZͰઃఆΛॻ͘ΞϓϦͷීٴ• ߴ͔ͭ3VCZʹΑΔಈతͳઃఆ– 8FCܥΤϯδχΞ͕ѻ͍͍͢– ։ൃऀӡ༻ऀͲ͜Ͱ3VCZΛֶΔ– 3VCZNSVCZͷීٴʹߩݙ• )551ϓϩτίϧΛ༰қʹར༻Մೳ– $ΞϓϦσόΠεʹػೳࠐΈ– ϓϩτίϧ)551ͰઃఆNSVCZ– )551ͷීٴʹߩݙ第7回フクオカRuby大賞 本審査 18