まさ@ブログ書き込み中

まさ@ブログ書き込み中

まさの旅、英語、プログラミング、プライベートについて、色々記録しています。

UnicornとRack

こんばんは。ロロノア・まさです。

 

未だに東京で忙しい日々を過ごしてます。これは某社の東京の中野のオフィスからの景色。心霊写真みたいに右上に写っている人は僕は知りません。

f:id:masaincebu:20170711231847j:plain

 

さぼさんに「アイキャッチ画像」という最先端の概念を学んだので何か写真を使おうとするも、そのために何も撮ってなかったのでこれで間に合わせた(間に合ってない)。

 

でも、そういうところがロロノアだよね。

 

 

Unicornってなに

さて、今日は僕がUnicornについて調べた基本知識を整理させていただきます。眠いし明日もあるので30分で書き終えたい。

 

なんか一見不思議なサイトの Unicorn と Nginx と Rails の関係 によると、

Unicorn は Rack Webサーバー の分類で、Rack と Webサーバーの機能を合わせて持つ。Webrickも同様。ただ、Webサーバーとしてのレスポンス処理はApacheやNginxに劣る。

 

Webrick」という文字はSinatraのアプリケーションをローカルで立ち上げる際にコンソールでよく見てたな。あれもRack(とやら)と、Webサーバーの機能を合わせて持ってるのか。

 

Rack Webサーバ(Rack Web Server)は、RubyアプリケーションとWebサーバをつなぐための中間サーバ、として扱われることが多い。通常のWebサーバはRackのような機能をサポートしていないが、Rack Webサーバを挟むことで、RubyアプリケーションなどをWebサーバ上で動作させることができる。Rack Webサーバ単体でも機能するにはするみたいだけど、Apacheなどの既存のWebサーバはレスポンスの処理がうまいので、それらと組み合わせて使うことが多いらしい。

 

なるほど。Rack WebサーバはRubyのアプリケーションなどをWebサーバ上で動作させるのね。んでRackってなに?

 

 

Rackってなに

Route 477(2008-07-16) によると、RackとはRubyの様々なフレームワークRubyを動かすための様々なWebサーバーの間を取り持つライブラリ。

 

ちなみにライブラリとは

ライブラリ(英: Library)は、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。

だそうな。

 

いろんな人たちがいろんなRubyフレームワークをつくる。そのときに一々いろんなRubyを動かすWebサーバーをサポートするのは面倒。そこでRackが間を取り持つ。Webサーバーもフレームワークも、Rackに従っていれば良い。

 

 

さらに深く理解する上で面白いのはこのサイト。

gihyo.jp

 

このサイトでは実際にコードを書いてRackの役割を確認しています。

 

端的にまとめると

  • rbファイル(simple_app.rb)をつくる。つくる際のポイントは
  • callというメソッドを持っていること
  • callメソッドの引数としてWebサーバからのリクエストを受けること
  • callメソッドは,次の要素を含むレスポンスを返すること
# coding: utf-8

class SimpleApp
  def call(env)
    p env
    case env['REQUEST_METHOD']
    when 'GET'
      [
        200,
        { 'Content-Type' => 'text/html' },
        ['<html><body><form method="POST"><input type="submit" value="見たい?" /></form></body></html>']
      ]
    when 'POST'
      [
        200,
        { 'Content-Type' => 'text/html' },
        ['<html><body>何見てんだよ</body></html>']
      ]
    end
  end
end
  • そしてconfig.ruファイルをつくる。
# coding: utf-8

require 'simple_app.rb'
run SimpleApp.new

 

この状態で rackup を実行するとWebrickが立ち上がって単純なアプリが使える。

ThinやMongrelなどがインストールされているのであればrackup -s thinなどで使える。

つまり、あらゆるWebサーバーに対応できる。

 

 

まとめ

ApacheとNginxとPassengerとUnicornの違い【すごい初心者向け】 - ふじいけ技術メモ を参考にしながらまとめると

 

 

らしいですな。ただ、このサイトで紹介されているRackの説明がまさが説明している(他のサイトの)内容とは少し違うのが気になるな。

 

一応まとめはここまでにして、とにかく寝る。おやすみ。

 

 

追記(7/12)

昨日書いた「Rackを使うrbファイルにはcallメソッドが必須」というくだりがありましたが、僕はSinatraを使った際にそれを作った覚えはありませんでした。

 

だとすると、gemでSinatraを読み込めば勝手にRackに対応する箇所があるだろうと思い、探して見ました。

 

sinatra/rack-protection/lib/rack/protection/frame_options.rb

f:id:masaincebu:20170712084154p:plain

 

 で、出た!

ステータスコードレスポンスヘッダとボディ返してる。

 

でも仕組みに関してはちんぷんかんぷんでした。OTZ