Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
Grunt.jsを使った Expressの開発環境構築
kamiyam .
WordBench千葉「レベル別Nginx活用法」
Endoh Shingo
Harbor RegistryのReplication機能
Masanori Nara
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
Yuta Matsumura
第9回rest勉強会 ダウンロード・アップロード編
ksimoji
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
Kazuhiro Hara
Riot + generator で始める新しいデータバインディング
Tsutomu Kawamura
Node js 入門
Satoshi Takami
1
of
42
Top clipped slide
mruby_nginx_module at pyfes 2013.11
Nov. 30, 2013
•
0 likes
4 likes
×
Be the first to like this
Show More
•
2,756 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Tatsuhiko Kubo
Follow
Tech Lead, Network at Mercari, Inc.
Advertisement
Advertisement
Advertisement
Recommended
mruby_nginx_module
Tatsuhiko Kubo
3.5K views
•
28 slides
mruby_nginx_module〜Embedded mruby into Nginx〜
Tatsuhiko Kubo
2.6K views
•
29 slides
Inside pixiv's infrastructure〜application cluster side〜
Tatsuhiko Kubo
14K views
•
75 slides
React VR ことはじめ
Kazuhiro Hara
3.6K views
•
24 slides
VSCodeで始めるAzure Static Web Apps開発
Yuta Matsumura
926 views
•
36 slides
SwaggerとAPIのデザイン
Kazuhiro Hara
3.7K views
•
33 slides
More Related Content
Slideshows for you
(20)
Grunt.jsを使った Expressの開発環境構築
kamiyam .
•
4.7K views
WordBench千葉「レベル別Nginx活用法」
Endoh Shingo
•
2K views
Harbor RegistryのReplication機能
Masanori Nara
•
1.3K views
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
Yuta Matsumura
•
4.6K views
第9回rest勉強会 ダウンロード・アップロード編
ksimoji
•
3.9K views
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
Kazuhiro Hara
•
1.5K views
Riot + generator で始める新しいデータバインディング
Tsutomu Kawamura
•
9.8K views
Node js 入門
Satoshi Takami
•
82.6K views
Gitを使おう
takemaedenki
•
177 views
づや会 Vol4 Node.jsとphpのパフォーマンスを比較してみる
zuya
•
7.8K views
今さら聞けないWebサーバの基本知識と選び方
Endoh Shingo
•
973 views
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
•
3.7K views
GCP HTTPロードバランサ運用例
Fumihiko Shiroyama
•
8.8K views
Node.js で Web アプリ開発
Tatsumi Naganuma
•
2.3K views
Bicep + VS Code で楽々Azure Deploy
Takekazu Omi
•
807 views
C# でブロックチェーン実装
Yuto Takei
•
7.1K views
海外で注目されてるJs framework “mithril”の特徴
Shoyo Kyou
•
16.6K views
Nuxt
卓馬 三浦
•
1.1K views
Vue.js with Go
Kazuhiro Kubota
•
9.7K views
Github codespaces すごく良い。もうこれで 十分なんじゃという話
xiidec
•
589 views
Similar to mruby_nginx_module at pyfes 2013.11
(20)
ngx_small_lightで動的サムネイル生成 #yapcasia2012
Tatsuhiko Kubo
•
6K views
nginxの紹介
Takashi Takizawa
•
84.8K views
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
Wataru NOGUCHI
•
1.7K views
Nginx勉強会
Yuji Otani
•
14.3K views
The History of Reactive Extensions
Yoshifumi Kawai
•
60.7K views
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
Katsunori Kanda
•
611 views
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
Yukihiko SAWANOBORI
•
1.3K views
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Koichiro Sumi
•
5.6K views
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
•
21.4K views
Swaggerを利用した新規サービス開発
recotech
•
9.9K views
20170311 Developing & Deploying .NET Core on Linux
Takayoshi Tanaka
•
572 views
【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた
Yasuhiro Yoshimura
•
9.5K views
PHP-Ninjaの裏側
Takayuki Miyauchi
•
2.8K views
Docker基礎+docker0.9, 0.10概要
Kazuyuki Mori
•
200.6K views
vendoring が無くなると Go x Github private repo x Docker 運用が地味に面倒になって困る話 (未完)
Itsuki Sakitsu
•
1.6K views
210630 python
Takuya Nishimoto
•
254 views
フロントエンド制作向け ビルドツールGruntを PHPバックエンド開発で利用する @M_Ishikawa #phpcon2013
Masayuki Ishikawa
•
5.1K views
Play framework 2.0のおすすめと1.2からのアップグレード
Kazuhiro Hara
•
8.6K views
Metahub for github
Suguru Oho
•
8K views
Tokyo ruby kaigi 10 (sogabe)
Takashi Sogabe
•
1.9K views
Advertisement
More from Tatsuhiko Kubo
(11)
memcached proxy server development and operation
Tatsuhiko Kubo
•
5.4K views
ngx_small_light
Tatsuhiko Kubo
•
8.1K views
pixiv thumbnails
Tatsuhiko Kubo
•
5.5K views
ngx_small_light at 第2回闇鍋プログラミング勉強会
Tatsuhiko Kubo
•
2.2K views
ngx_small_light
Tatsuhiko Kubo
•
1.4K views
memcachedからKyotoTycoonへ
Tatsuhiko Kubo
•
7K views
dtl - diff template library
Tatsuhiko Kubo
•
1.3K views
pixivの画像アップロードシステム
Tatsuhiko Kubo
•
5.7K views
Memorypool Key
Tatsuhiko Kubo
•
680 views
String Match Algrithm
Tatsuhiko Kubo
•
716 views
Diff
Tatsuhiko Kubo
•
1.4K views
mruby_nginx_module at pyfes 2013.11
mruby_nginx_module ∼ 久保 達彦 cubicdaiya@gmail.com pyfes 2013/11/30
自己紹介 ✦ 久保 達彦(H.N:bokko) ✦ @cubicdaiya(twitter, github) ✦ Senior Software
Engineer@pixiv Inc. ✦ インフラチーム所属 ✦ ミドルウェアの開発・運用とかやってます
Goはじめました
普段はnginxのモジュールとか作ってます ✦ mruby_nginx_module ✦ ✦ ngx_small_light ✦ ✦ Dynamic Image Transformation
for nginx ngx_access_token ✦ ✦ Embed mruby into nginx Porting of mod_access_token into nginx Nginx本体にも2件ほどパッチ送りました
WEB+DBでもnginxの記事を書きました WEB+DB PRESS Vol.72 ! □詳解nginx ! 設定の柔軟性と 優れたスケーラビリティ ! □共著者 @harukasan @semind
nginx in pixiv ✦ リバースプロキシとかキャッシュとかWebDAVとか 色々な箇所で稼働しています ✦ Using
ngx_lua in pixiv ✦ http://www.slideshare.net/harukayon/ngx-lua-public ✦ @harukasan++
とあるpixivを支えるインフラエンジニア談
mruby_nginx_module ∼Embed mruby into
nginx∼
mruby_nginx_module ✦ nginxの拡張モジュール ✦ nginx.confでmrubyが書ける ✦ nginxのモジュールがmrubyで書ける ✦ ngx_mrubyからfork at 2013/07 ✦ ✦ それまではPull
Request送る形で開発に参加してました http://git.io/d3sJtw
ngx_mrubyとの違い ✦ (mod|ngx)_mrubyはWebサーバの拡張記述統一が目的の一つ ✦ ✦ ✦ Apacheでもnginxでもできる限り同じように書けるのが重要 機能は極力mrbgemsで実現する方向 mruby_nginx_moduleはnginxとの親和性を重視 ✦ 機能は極力nginxのAPIで実現する方向
ドキュメント http://cubicdaiya.github.io/ mruby_nginx_module/
mruby ✦ 軽量Ruby ✦ 組み込み分野向けにまつもとゆきひろ氏が開発 ✦ Cと連携しやすいように設計されてる ✦ 個人的にはリッチなLuaというイメージ
Luaから見たmruby ✦ Cとの連携が非常に楽 ✦ ✦ Luaのスタック操作に比べるとかなり直感的 オブジェクト指向機能のサポート ✦ Luaでもtableで頑張ることはできるがmrubyに 比べると弱い
ngx_luaとmruby_nginx_module (あるいはngx_mruby)
ngx_lua ✦ ノンブロッキングアーキテクチャ ✦ nginxやその他拡張モジュールとの親和性が非常に高い ✦ 関連モジュールが豊富(lua-resty-xxx) ✦ 拡張モジュールというかもはやフレームワークの域 ✦ lua-jitと組み合わせたら鬼に金棒 ✦ OpenRestyの中核モジュール
mruby_nginx_module ✦ まだまだ発展途上 ✦ 機能とかライブラリとかいろいろ足りてない ✦ ノンブロッキングなアーキテクチャにするのが当面の課題 ✦ フック関連のディレクティブ群はほぼ同等レベルまで実装済 ✦ mruby_(rewrite|access|content|log)_handler等
今のところ使える機能 ✦ コードキャッシュ ✦ 各種ハンドラへのフック(rewrite,access,content,log) ✦ ヘッダおよびボディのフィルタリング ✦ nginxの変数へのアクセス(set & get) ✦ Nginx::(Request|Context|Time|Base64|Digest|etc) ✦ ✦ by
Nginx Core API(not mrbgems) Regexp(PCREベース)
nginxの実行フェーズとディレクティブ一覧 nginxの処理フェーズ(実行順) mruby_nginx_moduleのディレクティブ start-up nginx
& modules mruby_init, server rewrite find config rewrite post rewrite pre-access access post-access try files content log 備考 mruby_require serverコンテキストのrewrite 該当するlocationの探索 mruby_rewrite_handler locationのrewrite ! mruby_access_handler ファイルへのアクセス ! try_files mruby_content_handler mruby_log_handler bodyの生成 ロギング
その他のディレクティブ mruby_nginx_moduleのディレクティブ mruby_cache mruby_set 用途 コードキャッシュのOn/Off(default:On) mrubyの実行結果をnginxの変数にsetする mruby_header_filter HTTPヘッダの内容をフィルタリング or 上書きする mruby_body_filter HTTPボディの内容をフィルタリング
or 上書きする
Hello, World!
nginxの変数にset #=> 55
ファイル指定も可能 ・先頭に「/」がある場合は絶対パス ・それ以外の場合は相対パス(conf_prefixがroot)
ヘッダ書き換え # 本来はtext/html
レスポンスボディも(ry
各処理フェーズでデータ共有
Builtin-Regexp based PCRE
nginxとmrubyとPCRE ✦ nginxは正規表現処理にPCREを利用している ✦ mrubyには今のところRegexpが標準で入っていない ✦ ✦ PCREベースのmrbgemはnginxに組み込むのが困難 ✦ ✦ 別途mrbgemが必要(例:iij/mruby-regexp-pcre) nginxがpcre_(malloc|free)を上書きしてる でもPCREは使いたい
なので、 ✦ iij/mruby-regexp-pcreのコードを直接取り込み & 改変 ✦ pcre_(malloc|free)をさらに上書き ✦ ✦ ngx_luaも似たようなことをやってる http://bokko.hatenablog.com/entry/2013/10/13/142154
Nginx::Request ■処理中のリクエスト情報にアクセス location = /mruby
{ mruby_content_handler_code ' r = Nginx::Request.new Nginx.rputs(r.uri + "n") # => /mruby Nginx.rputs(r.method + "n") # => GET, POST, etc Nginx.rputs(r.protocol + "n") # => HTTP/1.x '; }
Nginx::Request ■nginxの変数にアクセス location /mruby { set
$maintainer "bokko"; mruby_content_handler_code ' r = Nginx::Request.new maintainer = r.var.maintainer Nginx.rputs(maintainer + "n") # => bokko '; }
Nginx::Headers_in ■リクエストヘッダへのアクセス hin = Nginx::Headers_in.new host
= hin["Host"] # Host header agent = hin["User-Agent"] # User-Agent header table = hin.headers_in_hash # all headers with hash table
Nginx::Headers_out ■レスポンスヘッダへのアクセス time = Nginx::Time.time() http_time
= Nginx::Time.http_time(time + 60 * 60 * 24) ! # Expiresヘッダを設定 hout = Nginx::Headers_out.new hout["Expires"] = http_time.to_s
Nginx::Time ■nginxのtime系APIのラッパー time = Nginx::Time.time
# => epoch value ! time = 1377710189 Nginx::Time.http_time(time) # => Wed, 28 Aug 2013 17:16:29 GMT Nginx::Time.cookie_time(time) # => Wed, 28-Aug-13 17:16:29 GMT ! Nginx::Time.utc_time Nginx::Time.local_time # => UTC Time(2013-11-30 xx:xx:xx) # => local time(2013-11-30 xx:xx:xx) ! http_time = Nginx::Time.http_time(time) Nginx::Time.parse_http_time(http_time) # => 1377710189
Nginx::Digest ■MD5, SHA1, HMAC-SHA1,
etc md5 = Nginx::Digest.md5("bokko") Nginx::Digest.hexdigest(md5) # => fe9749… ! sha1 = Nginx::Digest.sha1("bokko") Nginx::Digest.hexdigest(sha1) # => cea3d1… ! hmac_sha1 = Nginx::Digest.hmac_sha1("data", "key") Nginx::Digest.hexdigest(hmac_sha1) # => 10415…
Nginx::Base64 ■Base64 encode/decode encoded =
Nginx::Base64.encode("bokko") # => Ym9ra28= Nginx::Base64.decode(encoded) # => bokko
少し発展的な例
(mod|ngx)_access_token っぽいアクセス認証
(mod|ngx)_access_token ✦ S3のクエリ文字列認証っぽい機能を提供 ✦ ✦ ✦ 特定のアクセストークンに基づいた認証 リソースの有効期限設定 mod_access_token ✦ ✦ livedoor(現LINE)が開発 ngx_access_token ✦ @cubicdaiyaが開発
xxx_access_tokenの認証方式 以下のパラメータをリクエストURLに付加する ! ・AccessKey -> 公開 ・Expires 文字列 ->
有効期限(エポック値) ・Signature -> シグネチャ ! Text = Method + Uri + Expires + AccessKey Signature = Base64(HMAC_SHA1(Text, (※) SecretKey)) ! (※)秘密 文字列(サーバ側で設定)
ngx_access_token by mruby_nginx_module
(mod|ngx)_access_tokenと比べて、 ✦ mod_access_token by C ✦ ✦ ngx_access_token
by C ✦ ✦ 約200行 約300行 ngx_access_token by mruby ✦ 約10行 スクリプト言語の力ってすごいですね
今後の課題 ✦ 共有メモリAPI(Nginx::Shared) ✦ サブリクエストAPI(Nginx::SubRequest) ✦ ノンブロッキングソケットAPI(Nginx::Socket) ✦ Fiber(コルーチン)導入 ✦ etc
Advertisement