Home > 検索結果

検索結果

mruby の検索結果: 93

apache bench(ab)コマンドをRubyで拡張できるab-mrubyのDockerイメージを公開


ab-mrubyとはapache bench(abコマンド)のパラメータ設定や、ベンチマーク結果のテストをRubyで書けるベンチマークツールです。今回はそのab-mrubyコマンドのDockerイメージを作りました。

僕みたいにabコマンドを毎日のように使うエンジニアにとっては、ab-mrubyはそれなりに有用だと思っていたのですが、mrubyをビルドしたりaprを使ってabをビルドしたりいまいち使いにくいなぁと思っていました。しかしそれがDockerの登場によって面倒な所はほとんどラッパーできるようになり、ab-mrubyのDockerイメージを作る事によって必要な部分だけを弄ってすぐにab-mrubyを使えるようにしました。

自身のクライアントPCにDockerを入れるのは気軽にできると思うので是非一度遊んでみてください。

ab-mrubyについてご存じない方は以下のエントリを御覧ください。

最新のab-mrubyはGitHubにて公開しています。

簡単な使い方

ab-mrubyに関しては、上記のエントリに書いているので、今回は簡単な使い方の説明のみにします。

まずはab-mrubyのDockerイメージをDocker Hubからpullして下さい。

sudo docker pull matsumotory/ab-mruby

そして、実際に実行してみましょう。docker runコマンドに加えて最後の引数にURLを指定してやるだけでab-mrubyを試すことができます。

$ sudo docker run matsumotory/ab-mruby http://blog.matsumoto-r.jp/
======================================================================
This is ab-mruby using ApacheBench Version 2.3 <$Revision: 1430300 $>
Licensed to MATSUMOTO Ryosuke, https://github.com/matsumoto-r/ab-mruby

                          CONFIG PHASE

======================================================================
  Target Information  URL: http://blog.matsumoto-r.jp/
  Target Information HOST: blog.matsumoto-r.jp
  Target Information PORT: 80
  Target Information PATH: /
  Target Information  SSL: false
======================================================================
This is ab-mruby using ApacheBench Version 2.3 <$Revision: 1430300 $>
Licensed to MATSUMOTO Ryosuke, https://github.com/matsumoto-r/ab-mruby

                            TEST PHASE

======================================================================
[TEST CASE] [true] FailedRequests (0) should be 0
[TEST CASE] [true] WriteErrors (0) should be 0
[TEST CASE] [true] CompleteRequests (100) should be 100
[TEST CASE] [true] TransferRate (1179.60901260841) should be over 500
[TEST CASE] [false] RequestPerSecond (18.4716961893629) should be over 1000
[TEST CASE] [true] TimePerRequest (54.1368799999999) should be under 100
[TEST CASE] [true] TimePerConcurrentRequest (541.368799999999) should be under 3000
[TEST CASE] [true] ConnetcErrors (0) should be 0
[TEST CASE] [true] ReceiveErrors (0) should be 0
[TEST CASE] [true] LengthErrors (0) should be 0
[TEST CASE] [true] ExceptionsErrors (0) should be 0
[TEST CASE] [true] Non2xxResponses (0) should be 0

test suites: [false]

すると、予めRubyで記述したベンチマークパラメータとテストケースによって実行されたベンチマークとテストの結果が得られます。おおおお、RequestPerSecondがテストケースの値より低く出ているのでテストが失敗していますねー、とかがわかります。

Rubyでベンチマークパラメータやテストを書いて自分専用のDockerイメージを作る

ab-mrubyのDockerイメージはab-mruby/docker/ディレクトリ以下のRubyで書かれたベンチマークパラメータとテストケースのサンプルを元に実行されています。それらを自分なりに変更したい場合は、

git clone https://github.com/matsumoto-r/ab-mruby.git
cd ab-mruby
vi docker/ab-mruby.conf.rb
vi docker/ab-mruby.test.rb
sudo docker build -t local/ab-mruby .
sudo docker run local/ab-mruby http://blog.matsumoto-r.jp/

ab-mruby.conf.rbにベンチマークパラメータを、ab-mruby.test.rbにテストケースを書くと、自分なりのベンチマークパラメータやテストケースを反映した自分専用のDockerイメージを作成する事ができます。自由にGitHubからforkして頂き、そこからDocker Hubと連携してベンチマークイメージを作るのも良いと思います。

書き方は、

上記に上げたab-mrubyに関するエントリやab-mrubyのGitHubレポジトリを参考にして下さい。

ab-mrubyのDockerイメージを使って有意義なベンチマークライフを過ごしてみてはいかがでしょうか!

Apacheのシンボリックリンク検査に関するTOCTOU問題をmod_mrubyで解決してみた


共有ホスティングにおいて、各利用ユーザに対してシンボリックリンクの使用を許可していた場合に、他のユーザ領域のコンテンツを閲覧できたりする問題があるため、SymLinksIfOnwerMatchの設定によりリンクのownerとリンク先のファイルのownerが一致していない限りはリンクを辿らないようにする対処がされてきましたが、そもそもリンクの検査とファイル作成のタイミングによっては、検査をすり抜け、閲覧を可能にするTOCTOU問題がありました。

この件に関しては、「Apache HTTPD: `Options -FollowSymLinks` は不完全」に詳しく解説されているのでそちらを見て頂くとして、リンク使用は許可しつつもそのTOCTOU問題を解決するための一つの方法として、open()したコンテンツファイルのfdから情報を検査してownerに不一致があった場合はレスポンスを返さないようにする、というアプローチがあります。

実装として、Apache本体に手を入れたり、Apacheモジュールで対応したり、といくつか方法がありますが、今日はWebホスティングのセキュリテイとmod_mrubyの実装の復習がてら、単純な静的コンテンツへのリクエストにおけるこの問題をmod_mrubyで楽に解決できるようにしてみました。

具体的には、コンテンツがopen()されているアウトプットフィルターフェイズにおいてmod_mrubyで介入し、任意のuidと、open()されているコンテンツのuidが異なっていたらエラーを返す、という処理を書きました。

まずは、Apacheの設定を以下のようにして、

SetOutputFilter mruby
mrubyOutputFilter /path/to/solved_link_toctou.rb

/path/to/solved_link_toctou.rbを以下のようにします。

uid = 1000

f = Apache::Filter.new

if f.uid != uid
  f.error_create Apache::HTTP_SERVICE_UNAVAILABLE
end

このように実装することで、f.uidメソッドから既にopen()されたファイルのuid情報を取得できるので、TOCTOU問題を気にすることなくownerのチェックを行えます。上記の例の場合では、openしたコンテンツのuidが1000じゃなければ503エラーを返し、一致すれば何もせずにリクエストのあったコンテンツの内容をそのまま返します。後は幾つか細かい点があるのですが、それを書くと内容が広がりすぎるので一旦はこの程度の検査に留めておきます。

というわけで、mod_mrubyのリハビリがてら、SymLinksIfOnwerMatchTOCTOU問題をmod_mrubyで解決してみました。mod_mrubyだと非常に簡単に書けるので楽でした。

Dockerとmrubyで迅速かつ容易にnginxとapacheの柔軟なリバースプロキシ構成を構築する


Docker Hubがアナウンスされて以来、焦ってDockerを触っている@matsumotoryです。

今日は早速mod_mrubyngx_mrubyをdocker buildに対応させました。これによって、Docker環境においてmod_mrubyを組み込んだApache httpdやngx_mrubyを組み込んだnginxを迅速かつ容易に連携させる事ができるようになります。

今日はその一例を紹介したいと思います。

全文を読む

Docker HubとGitHubを連携させてmod_mruby実行環境をDockerで簡単にデプロイ


Docker Hub公開のアナウンスがあったので、早速Docker HubとGitHubを連携させてmod_mrubyの実行環境をDockerイメージとして作った上で、それをMac上のVagrantで動くCoreOS内のDocker環境にデプロイしてみました。

本エントリではmod_mrubyとしていますがここは重要ではなく、自身が開発しているGitHubのアプリケーションに置き換えて読んで頂けると、便利さが見えてくるかと思います。

試してみると、非常に簡単にDockerイメージを作成できた上に、迅速にmod_mrubyの軽量な実行環境をデプロイできたので、その流れを簡単に紹介したいと思います。

全文を読む

OSvのような環境でもサクっと動くmrubyのWebサーバ作った


OSvがとても面白いので色々いじっていると、結果的にmruby-simplehttpserverというWebサーバをmrubyで動かすためのmrubyモジュールができてしまいました。

これは、OSvのようにライブラリをがんがん入れられないような環境でも、とりあえずSocketとIOがあれば動くシンプルなWebサーバを動かすためのmrubyモジュールです。

そもそもOSvって何?という方はこの辺りを見るかsyuu1228さんに聞くのが良いと思います。簡単に言うと、これからの時代、ハイパーバイザにがんがん仮想マシンをデプロイする際に、その仮想マシンにリッチなOSがあまり必要ないケースって結構あって(例えばmemcachedだけが動いているVMとか)、OSvはそういう用途に省メモリかつCPUのオーバーヘッドを低減して高速に動作するまるでプロセスのように扱えるOSです。プロセスは言い過ぎましたが、仮想マシンにも関わらず起動はmruby使用の場合、1、2秒で起動するので非常に高速です。

で、通常はコアの上にJVMがのっていってその上にサーバ+アプリケーションが動く仕組みになっているのですが、そのJVMの部分を他のVM(言語処理系的な意味合いの)を載せ替える事もできて、そこにサクっとsyuu1228さんがmrubyのVMをのせるハックをして今では本家にもマージされ、コアの上でmrubyのVMを動くようにimageを作ればアプリケーションとしてmrubyで書いたコードが動くようになります。JVMもZFSも取り外しているのでかなり高速かつ軽量に動作します。

かといって、OSvはUbuntuとかそういうライブラリをどんどん入れられるようなリッチな環境ではないのですが、Javaアプリが動く程度にSocketやIO等は普通に動くのでそれにのみ依存したWeb機能を持ったmrubyアプリケーションサーバをつくろうと思った次第です。mruby-simplehttpserverを使えば、OSv上で動くmrubyでWebアプリケーションを容易に実装することができるようになりました。

このような特徴を持つOSvをうまく使えば、状態を持つデータはどこか別の場所に置いておいて、OSvやその上で動くアプリケーションをイミュータブルに動かしたりと、次の世代の使い捨てデプロイ手法を実現しやすくなるのではないでしょうか。そういう方向性でもOSvは興味深いOSだと思っています。

前置きが長くなりましたが、では実際に動かしてみましょう。

全文を読む

Home > 検索結果

検索
フィード
メタ情報

Return to page top