Submit Search
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
11 likes
3,324 views
Shuichi Yukimoto
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
Engineering
Read more
1 of 26
Download now
Downloaded 19 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
More Related Content
PPTX
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
toshi_pp
PDF
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
PDF
nginxの紹介
Takashi Takizawa
PDF
lua_nginx_module JSON-RPC 2.0 Batch Request
mosa siru
PDF
Webサーバ勉強会#4
oranie Narut
PPTX
Zabbixの分散構築~ConoHa VPSでのzabbix server構築~
真乙 九龍
PPTX
Nginx勉強会
Yuji Otani
PDF
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
toshi_pp
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
nginxの紹介
Takashi Takizawa
lua_nginx_module JSON-RPC 2.0 Batch Request
mosa siru
Webサーバ勉強会#4
oranie Narut
Zabbixの分散構築~ConoHa VPSでのzabbix server構築~
真乙 九龍
Nginx勉強会
Yuji Otani
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
What's hot
(20)
PDF
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
さくらインターネット株式会社
PDF
Nginx バージョンアップ動向(2015/01〜2015/06)
Narimichi Takamura
PPTX
OpenShift from Easy way to Hard ? Way
ロフト くん
PPTX
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
真乙 九龍
PPTX
Java on Azure with Docker container
Yoshio Terada
PPTX
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
Akihiro Kitada
PDF
Bluemix sign-up
YUSUKE MORIZUMI
PDF
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
PDF
Mackerelによる 簡単サーバー管理入門と発展形
Shinji Tanaka
PPTX
AWSのElastic BeanstalkでWordPressを 構築レスで導入してみる。
Daigou Harada
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
PPTX
誰にでもできるパフォーマンスチューニング
Kiyokazu Kaba
PDF
Reading NATS
Katsunori Kawaguchi
PDF
Mackerel & Norikra mackerel meetup #4 LT
Masahiro Nagano
PPTX
ZabbixとAWS
真乙 九龍
PPTX
Webアプリケーションによる電源管理システムのご紹介
npsg
PPTX
Jenkins User Conference 東京 2015
Kohsuke Kawaguchi
PDF
Nginx バージョンアップ動向(2015/07〜2015/12)
Narimichi Takamura
PDF
Chefで始めるWindows Server構築
Takashi Kanai
PDF
Devlove mackerel
Daisuke Kasuya
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
さくらインターネット株式会社
Nginx バージョンアップ動向(2015/01〜2015/06)
Narimichi Takamura
OpenShift from Easy way to Hard ? Way
ロフト くん
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
真乙 九龍
Java on Azure with Docker container
Yoshio Terada
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
Akihiro Kitada
Bluemix sign-up
YUSUKE MORIZUMI
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
Mackerelによる 簡単サーバー管理入門と発展形
Shinji Tanaka
AWSのElastic BeanstalkでWordPressを 構築レスで導入してみる。
Daigou Harada
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
誰にでもできるパフォーマンスチューニング
Kiyokazu Kaba
Reading NATS
Katsunori Kawaguchi
Mackerel & Norikra mackerel meetup #4 LT
Masahiro Nagano
ZabbixとAWS
真乙 九龍
Webアプリケーションによる電源管理システムのご紹介
npsg
Jenkins User Conference 東京 2015
Kohsuke Kawaguchi
Nginx バージョンアップ動向(2015/07〜2015/12)
Narimichi Takamura
Chefで始めるWindows Server構築
Takashi Kanai
Devlove mackerel
Daisuke Kasuya
Ad
Similar to nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
(20)
PDF
Pbox on softlayer
Shuichi Yukimoto
PPT
Osoljp201210 oi swift
Noriyasu Sakaue
PDF
OSC2011Tokyo/Fall OpenStack Swift入門
irix_jp
PDF
第2回名古屋SoftLayer勉強会 PBOX on SoftLayer
Shuichi Yukimoto
PPTX
ConoHaオブジェクトストレージ 利用ケース
Junichi Noda
PPTX
コア・コンテキスト管理 - FIWARE WednesdayWebinars
fisuda
PDF
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
PPTX
OpenStack Congress Deep Dive
masahito12
PDF
OpenStack Object Storage; Usage
irix_jp
PDF
Webフレームワークを作ってる話 #osakapy
Masashi Shibata
PPTX
Dokkuの活用と内部構造
修平 富田
PPT
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
PDF
コンテナ事例 CircleCI, Cucumber-Chef
Yukihiko SAWANOBORI
PDF
OSC2012 Nagoya - OpenStack - Storage System; Overview
irix_jp
PDF
CloudStack Ecosystem Day - OpenStack/Swift
irix_jp
PDF
クラウド開発に役立つ OSS あれこれ
Masataka MIZUNO
PDF
OpenStack超入門シリーズ いまさら聞けないSwiftの使い方
Toru Makabe
PDF
大規模運用で見えるWebプロトコルの理想と現実、そして今後 #html5j #html5j_b
Yahoo!デベロッパーネットワーク
PPT
Lesson01
MRI
PDF
Node-v0.12のTLSを256倍使いこなす方法
shigeki_ohtsu
Pbox on softlayer
Shuichi Yukimoto
Osoljp201210 oi swift
Noriyasu Sakaue
OSC2011Tokyo/Fall OpenStack Swift入門
irix_jp
第2回名古屋SoftLayer勉強会 PBOX on SoftLayer
Shuichi Yukimoto
ConoHaオブジェクトストレージ 利用ケース
Junichi Noda
コア・コンテキスト管理 - FIWARE WednesdayWebinars
fisuda
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
OpenStack Congress Deep Dive
masahito12
OpenStack Object Storage; Usage
irix_jp
Webフレームワークを作ってる話 #osakapy
Masashi Shibata
Dokkuの活用と内部構造
修平 富田
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
コンテナ事例 CircleCI, Cucumber-Chef
Yukihiko SAWANOBORI
OSC2012 Nagoya - OpenStack - Storage System; Overview
irix_jp
CloudStack Ecosystem Day - OpenStack/Swift
irix_jp
クラウド開発に役立つ OSS あれこれ
Masataka MIZUNO
OpenStack超入門シリーズ いまさら聞けないSwiftの使い方
Toru Makabe
大規模運用で見えるWebプロトコルの理想と現実、そして今後 #html5j #html5j_b
Yahoo!デベロッパーネットワーク
Lesson01
MRI
Node-v0.12のTLSを256倍使いこなす方法
shigeki_ohtsu
Ad
More from Shuichi Yukimoto
(16)
PDF
Ocif2016_go_web_freamwork
Shuichi Yukimoto
PDF
Slackbot_by_OpenWhisk
Shuichi Yukimoto
PDF
Softlayer_API_openWhisk
Shuichi Yukimoto
PDF
Send grid softlayer_nagoya
Shuichi Yukimoto
PDF
Softlayer_bluemix-summit
Shuichi Yukimoto
PDF
Softlayer_summit
Shuichi Yukimoto
PDF
SendGridを使ってみよう
Shuichi Yukimoto
PPTX
Mnu_pbox
Shuichi Yukimoto
PDF
Emacs softLayer
Shuichi Yukimoto
PDF
Soft layer APIの使い方と実装のポイント
Shuichi Yukimoto
PDF
Softlayer勉強会#2
Shuichi Yukimoto
PDF
勉強会資料#1
Shuichi Yukimoto
PDF
SoftLayerオブジェクトストレージと連携サービスPBOXについて
Shuichi Yukimoto
PDF
Object storageを使ってみる
Shuichi Yukimoto
PDF
Mnu特許説明スライド
Shuichi Yukimoto
PPTX
第2回ビジネスモバイル研究会
Shuichi Yukimoto
Ocif2016_go_web_freamwork
Shuichi Yukimoto
Slackbot_by_OpenWhisk
Shuichi Yukimoto
Softlayer_API_openWhisk
Shuichi Yukimoto
Send grid softlayer_nagoya
Shuichi Yukimoto
Softlayer_bluemix-summit
Shuichi Yukimoto
Softlayer_summit
Shuichi Yukimoto
SendGridを使ってみよう
Shuichi Yukimoto
Mnu_pbox
Shuichi Yukimoto
Emacs softLayer
Shuichi Yukimoto
Soft layer APIの使い方と実装のポイント
Shuichi Yukimoto
Softlayer勉強会#2
Shuichi Yukimoto
勉強会資料#1
Shuichi Yukimoto
SoftLayerオブジェクトストレージと連携サービスPBOXについて
Shuichi Yukimoto
Object storageを使ってみる
Shuichi Yukimoto
Mnu特許説明スライド
Shuichi Yukimoto
第2回ビジネスモバイル研究会
Shuichi Yukimoto
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
1.
nginx + lua
+ ObjectStorage ファイルアップロード/ダウンロードの高速化 2014.12.11 Code the Clouds Mix-up Vol.2 株式会社MNU 雪本修一
2.
雪本 修一 Shuichi
Yukimoto 株式会社MNU 代表取締役社長 電気通信大学の認定ベンチャーとして起業。 現在も現役プログラマとしてコードを書いている。 好きな言語はJavaScript,Scheme,Lisp,Python SoftLayerを使い始めて一年ぐらい 弊社はSoftLyerのリフェラルパートナーです。 twitter:@nsas454 facebook:shuichi.yukimoto
3.
今日のお話 • PBOXで実装した技術についてのご紹介
• nginxの拡張モジュールを使ったアップロード とダウンロードの高速化を実現した仕組み • nginxの拡張モジュールの実装方法について
4.
nginx • ロシアのIgor
Sysoev氏によって、1日に5億リ クエストを処理するWebサイトのHTTPサーバー として開発された • 注目されるようになったのは、C10K問題(クラ イアント1万台問題、注2)が叫ばれるようになっ た2000年代後半です
5.
Lua • 動的型付言語
• 高速に動作する • ゲームなどで広く利用されている言語 • インクリメンタルGCで有名 • nginxもluaで実装されているそうです。 • wikipediaより
8.
ファイル フロントエンドバックエンドストレージ nginx
gunicorn object Storage 認証/リクエスト PUT • pboxはnginx + gunicornで構成されているが、 ファイルのアップロード、ダウンロード処理を gunicornでやるのは高コスト • アップロード/ダウンロードには複雑な処理は必要 無いにもかかわらず、gunicornのセッションを専 有するのは良くない!
9.
ファイル フロントエンドバックエンドストレージ nginx
object PUT gunicorn Storage redis tornade LUA PUTリクエスト 認証/ストレージ情報 • nginx拡張でなるべく多くの同時リクエストを 捌きつつ、静的ファイルの送受信を行う
10.
何故nginx拡張を使うのか? • pboxはnginx
+ gunicornで構成されているが、ファ イルのアップロード、ダウンロード処理をgunicorn でやるのは高コスト • アップロード/ダウンロードには複雑な処理は必要 無いにもかかわらず、gunicornのセッションを専有 するのは良くない方法 • nginx拡張でなるべく多くの同時リクエストを捌き つつ、静的ファイルの送受信を行う
11.
nginx + HttpLuaModule
12.
インストール • luajitのインストール
• nginx + HttpLuaModuleのビルド&インストール • 詳細は • http://wiki.nginx.org/HttpLuaModule
13.
nginx.conf • luaモジュールをインストールしたら、専用のディレクティブが使える
• 例えば、content_by_lua_file でcontentフェーズにluaを呼び出すこ とができる。 • 参考: http://wiki.nginx.org/HttpLuaModule#Directives • nginxのフェーズについては http://wiki.nginx.org/Phases を参照 • レスポンス全体をluaで作る場合はcontentフェーズを使う。認証だけ luaを使う場合はaccess_by_lua_file ディレクティブを使用するなど の使い分けを行う。pboxでどうしているかは後述
14.
nginxのフェーズ • nginx
の Phase のうち、Rewrite, Access, Content, Log のフェーズに 対してフックする仕組みを提供
15.
lua-nginx-module が提供 する主なフックの仕組み
• Rewrite Phase • set_by_lua:変数の設定、ヘッダの操作、リダイレクト等が可能 • rewrite_by_lua:Rewrite Phase の最後で実施され、自由度の高い rewrite処理を実現可能 • Access Phase • access_by_lua:自由度の高い認可処理を実現可能 • Content Phase • content_by_lua:コンテンツの生成 • header_filter_by_lua:コンテンツ生成後、header に対するフィルタ処理(書き換えや追加など)に対応 • body_filter_by_lua:コンテンツ生成後、body に対するフィルタ処理 • Log Phase • log_by_lua:ログ処理のタイミングで動作。ここでリクエストの情報を変数にためておくことで、nginx + lua だけで集計の仕組みを作ることも可能
16.
luaで何ができるのか? • 特に重要なのは以下の2つ
• サブリクエスト • tcp/udpソケット通信 • 詳しくは下記で説明
17.
サブリクエスト • ざっくり言えば、他のlocationを呼ぶ機能
• ngx.location.captureを使用する • 一度のリクエストで何回もサブリクエストを 呼ぶことができたりする
18.
tcp/udpソケット通信 • ngx.socket.tcp
/ ngx.socket.udp でソケット通信ができ る。luaの組込ソケットと互換のインターフェイスを持って いるが、内部動作が違うのでかならずこちらを使うこと。 • このソケットはnon-blockで動作し、待ち時間で別のリ クエストを処理してくれる • pboxではこのソケットの上にHTTPプロトコルを実装した lua-resty-httpを使用してObjectStorageとの通信を行っ ている。
19.
アップロード/ダウンロードの概要 • pboxのファイルアップロード/ダウンロードは以下の動作が必要
• 認証:リクエストヘッダで送られてくる認証トークンが正しいかSQL に保存された情報との比較を行う。また、ここでObjectStorageへの url、認証情報を取得する • ObjectStorageへのアップロード/ダウンロード:1で得られた情 報を元に実際にファイルをアップロード/ダウンロードする • (アップロードの場合のみ)SQLへアップロードしたファイルのメ タ情報を保存する:ObjectStorageで管理できない追加情報をpbox 持たせるため、ファイル・ディレクトリの情報はSQL側で持っている
20.
HttpLuaModule • pboxはcontentフェーズでluaを使用し、
• 1. 認証を内部サブリクエスト • 2. オブジェクトストレージへのアクセスにソ ケット • 上記を使用しているが、次のようにする方法も あった(RestfulなAPIのために断念した)。
21.
余談 • ダウンロード:
accessフェーズのみluaで行い、 contentはObjectStorageへプロキシすることも できる(proxy_passディレクティブを使う)。 • アップロード: ObjectStorageへのアップロード 前と後にluaの処理が入る。(またレスポンスは ObjectStorageのものを直接使わず、メタ情報 をjson返したい。)そのため、contentフェーズ をluaで書く。
22.
まとめ • nginxのフェーズの概念は超重要。1つは省力化のため。
アップロードはproxy_passを使うことでluaの記述を 減らすこともできる(pboxではやらないが)。 • もう1つは出来ることが違う。たとえば、accessフェー ズでレスポンスの中身を書き換えることはできない。 logフェーズや、post_actionではluaからサブリクエ ストが使えないなど、フェーズを意識する必要がある。
23.
さいごに • とりあえず、重要な事は2つだけ
• サブリクエスト(ngx.location.capture)はマジ便利 • 100% non-blockingなHTTP通信でObjectStorage へアクセスしてます
24.
Appendix
25.
location /internals {
internal; proxy_pass http://backend; } location ~ /([^/]+)/files/(.*)$ { content_by_lua_file content_file.lua; } nginx.conf
26.
local http =
require "resty.http" local cjson = require "cjson" local user = ngx.var[1] -- location の $1 相当 local path = ngx.var[2] -- location の $2 相当 --- 認証 local res = ngx.location.capture('/internals/auth', { args = { token = token, user=user, path=path }, }) if res.status ~= 200 then ngx.exit(res.status) end --- ObjectStorageへのURL,Tokenを認証時に返してもらう local body = cjson.decode(res.body) local host = body.host local path = body.path local token = body.token --- 通信確立 local httpc = http.new() httpc:connect(host, 80) --- ObjectStorageへGETリクエスト発行 local res, err = httpc:request{ path = path, method = 'GET', headers = {['X-Auth-Token'] = token} } --- レスポンスボディをそのままnginxのレスポンスとして返す local reader = res.body_reader repeat local chunk, err = reader(chunk_size) ngx.say(chunk) until not chunk content_file.lua
Download