Rack起動
Rack gemをインストール
1
|
|
config.ru
1 2 3 4 5 6 7 8 9 10 11 |
|
起動
1
|
|
起動確認
- ブラウザで
localhost:9292
で接続
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 27 28 29 30 31 32 33 34 35 |
|
Rack Applicationの仕様
Rackアプリケーションの形式
- callメソッドに応答するオブジェクト
- callの引数envはCGI環境変数(ハッシュ)
- callの戻り値は[HTTPステータス番号, レスポンスヘッダ, ボディ]の形式
- ステータス番号は3桁の整数
- より正確にはto_iに応答してステータスを返すオブジェクト
- レスポンスヘッダはハッシュ
- より正確にはeachイテレータに応答しkey, valueの組をyieldするオブジェクト
- ボディは次の3つのバリエーションのどれかひとつ
- 文字列が要素の配列([文字列, 文字列, … ])(上の例ではこれを使用)
- to_pathメソッドを持つオブジェクト(ファイルを返す)
- ストリーム(File-like)オブジェクト(ストリームから読んで返す)
- ステータス番号は3桁の整数
オブジェクト生成方法の種類
- インスタンスメソッドとして定義する場合
- 特異メソッドとして定義する場合
- lambdaを用いる場合
インスタンスメソッドとして定義する場合
1 2 3 4 5 6 7 |
|
特異メソッドとして定義する場合
1 2 3 4 5 6 7 |
|
lambdaを用いる場合
1 2 |
|
lambda(またはproc)の実行メソッドがProc#callで、名前がRack仕様のcallと同じため実行できるという仕組みになっている。
Rack Applicationの構成
一般的には複数のRackアプリケーションを連結した構成を取る。典型的なRackアプリケーションの模式図は下記のようになる。
1
|
|
- エンドポイント
- ミドルウエア
- Rackハンドラ
エンドポイント
エンドポイントは(サーバから一番離れた)末端のRackアプリケーション。典型的にはWebアプリケーションそのものになる。RailsアプリケーションもRackエンドポイントである。
下記はRailsアプリケーションのconfig.ru
。
1 2 3 |
|
Rackに含まれているエンドポイントアプリケーションをいくつか示す。
- Rack::File - 静的ファイルサーバ(ディレクトリリスティングなし)
- Rack::Directory - 静的ファイルサーバ(ディレクトリリスティング付き)
- Rack::Lobster - 動作確認用サンプル
ミドルウエア
ミドルウエアはエンドポイントとサーバの中間に位置するRackアプリケーション。典型的なミドルウエアとは次のようなものになる。
- callはクラスのインスタンスメソッドとして記述する
- コンストラクタ引数に上流(Webアプリケーション側)Rackアプリケーションを取る
ミドルウエアは中間の各種フィルタ処理を担当する。Rack gemに含まれるRackアプリケーションの大部分はこのミドルウエアである。これも主なものからいくつか示す。
- Rack::Static - 静的ファイルサーバ(各種フィルタ機能付き)
- Rack::Deflater - 圧縮エンコーディング対応
- Rack::ETag - HTTP ETagを処理
- Rack::ConditionalGet - If-None-Match及びIf-Modified-Sinceの対応
- Rack::MockRequest - テスト用モック(実際のHTTPを使わない)
- Rack::Lint - プロトコルの実行時チェック(開発時は自動的に挿入される)
- Rack::ShowExceptions - 例外時に詳細情報を表示(開発時は自動的に挿入される)
- Rack::ContentLength - Content-Lengthをセットする
- Rack::Cascade - 複数アプリケーションの分岐
なお「ミドルウエア」という用語はRackアプリケーション全般という意味でも使われている(広義のミドルウエア)。
Rackハンドラ
環境や用途の違いによりthin/puma/webrick/mongrelなど様々のサーバの選択がある。この環境の違いを吸収する部分がRackハンドラである。Rubyベースの環境で用いられるサーバにはRackハンドラが用意されており、それぞれ仕様の異なるサーバに対してRackの共通仕様を提供する。
開発環境でrackup
を起動する時、rackup -s webrick
のように立ち上げるサーバ種類を選択することもできる。
config.ru
にサーバの種類やポート番号などを直接設定することも可能。
1
|
|
Rack DSL
Rackアプリケーションの構成はconfig.ru
に記述するけど、この際用いられるのがRack DSLと呼ばれる記法である。これはRack::Builderモジュールで実装されている。
ここで次のような構成を持っているアプリケーションを作ってみる。
1
|
|
Rack::Directoryは指定するディレクトリを静的ファイルサーバとして立ち上げる。
Rack::Deflaterは圧縮エンコーディングに対応する。
Rack::ETagでHTTPヘッダにETagフィールドをセットする。
config.ru
を修正する。
1 2 3 |
|
ここでミドルウエアとエンドポイントの違いが重要になる。
- ミドルウエアは接続順にuseで記述する
- エンドポイントは最後にrunで記述する
useを使わずにrunだけで記述することも可能だが、下記のようにコードが増える。この程度だとまだ十分だけど、Ruby on Rails
のように多数のミドルウエアを直列接続することを考えたらuse
を使った方が良いであろう。
1 2 3 4 5 6 |
|
上記のアプリケーションはpublickディレクトリを静的ファイルサーバとして立ち上げる。
Rack::Static
を用いたらディレクトリ(URLの最後が'/‘)に対するアクセスに対してもディレクトリリスティングではなく、静的ページに対応できる。
1
|
|
Rack::Staticは実質的にエンドポイントの機能を持っているが、コンストラクタの第一引数がapp
なのでエンドポイントにはならない。そこで空のエンドポイントを作って対応する。
1 2 3 4 5 6 7 8 9 |
|
rack/static.rb at master · rack/rack · GitHub
1 2 3 4 5 6 7 8 9 10 |
|
指定したtest1.txt
が表示される。