メニュー 蕭寥亭 検索

自宅サーバ

10. Ruby + Phusion Passenger + Nginx で Sinatra が動く環境を作る

PHP Logo

 当サイトは動的ページの処理のためにずっと PHP を使ってきましたが、いささかマンネリ気味(別名義の旧サイトを含めると8年ぐらい使ってました)だったところに、2011年からフレームワークに採用していた codeIgniter がライセンスの問題でゴタゴタしたりしてなんだか将来性が不透明に。

 フレームワークを変更しなければならない事態が来るかもしれないなら、今のうちから準備しておこう、そうだ、どうせならこの機会に勉強も兼ねてサーバーサイドのプログラミング言語も Ruby に変更してしまえ、ということにいつのまにかなりました。

Ruby Logo

 Ruby の Web アプリケーションフレームワークと言えば Ruby on Rails が大メジャーなわけですが、機能が充実している分、ウチのサイトには大げさすぎるようだしおぼえなきゃいけないことも多そうだし、Ruby に習熟していないわたしには、言語とフレームワークの両方で負担がかかるのでは厳しい。調べたところ、知名度は Rails に比べて全然ですが軽量で理解しやすそうだったので、フレームワークは Sinatra にしました。

 ついでに Web サーバーも Apache から Nginx に変更しました。Apache で Ruby を動かすこともできるのですが、Apache も自宅サーバーを始めたころからずっとで、マンネリだったので(笑)。マジメな理由も挙げとくと、Nginx は Apache に比べて機能は少ないものの軽量低負荷とのことでウチのサイト向きだなと思ったから。

 そして Nginx と Ruby・Sinatra を連携させるためのモジュールが Phusion Passenger ということになります。

 この Ruby + Phusion Passenger + Nginx + Sinatra という組み合わせ、動く環境を作るのにけっこう苦労しました。Apache + PHP と比べると、本でもネットでも資料が少なくて・・・。それに Phusion Passenger と Nginx についてはパッケージからインストールせず、コンパイル・ビルドというイバラの道を選択してしまったためになおさら(単にパッケージからインストールする方法を最近まで知らなかったからですが)。苦労して構築した方法を忘れてまた調べるのはしんどいので、ここに書いときます。ご参考まで。

 なお、Phusion Passenger と Nginx をパッケージからインストールしたい場合は、 ここに英文のマニュアル があります。"2. Installation" の章に Debian・Ubuntu の apt 系、Red Hat・Fedora・CentOS・ScientificLinux の yum 系と Mac OS X 向けの解説がそれぞれありますので、使用するOSに合わせて参照するとよいかと。

 以下の記述はOSに Ubuntu 12.04 LTS Server 64bit を使い、OSインストール直後の何もパッケージを追加していない状態を前提としています。他のディストリビューションを使っていたり、すでに各種パッケージを追加済の場合は、適宜読み替えていただく必要があるでしょう。

 まずはお約束ですが、パッケージ情報の最新化とインストール済パッケージの更新をお忘れなく。

$ sudo apt-get update $ sudo apt-get upgrade

 当然ながら第一に必要なのが Ruby 。apt コマンドでインストールしますが、ここでパッケージに単なる "ruby" を指定して、sudo apt-get install ruby としてしまうと、Ubuntu 12.04 の場合、Ruby 1.8.7 がインストールされてしまいます。1.8.7 はすでに引退扱いでサポート対象外とされていますので、特に理由がなければ 1.9 系をインストールしましょう。なお、2.0 系のパッケージは Ubuntu 12.04 には用意されていないようです。

$ sudo apt-get install ruby1.9.1

 後でコンパイル・ビルドを行う必要があるので、必要なツール類をまとめて入れておきます。パッケージは build-essential です。

$ sudo apt-get install build-essential

 次は Phusion Passenger の番。まず RubyGems を使って Passenger の gem をインストールします。ここでビルドツールが入っていないとコケます(やってみた)。

$ sudo gem install passenger

 Passenger の gem をインストールすると、passenger-install-nginx-module という Passenger と Nginx 両方をインストールするためのコマンドが使えるようになります。ただし、この時点で使うと多分ライブラリが足りなくてコケます。

 この時点で使うとどうなるかというと

$ sudo passenger-install-nginx-module passenger-install-nginx-module・その1

 上記の表示が出て、いったん停止します。ここはいわば前置きで、この先から実際のインストールの処理が始まります。最後の行に「処理を継続するなら Enter を、中止するなら Ctrl-C を押す」とありますので、選択します。継続すると

passenger-install-nginx-module・その2

必要なソフトウェアがインストール済かどうかを確認してくれるのですが、4カ所が " no " となってしまいました。

 最後の行はまた「処理を継続するなら Enter を、中止するなら Ctrl-C を押す」となっています。継続を選択してもインストールはできないのですが、対策を提示してくれるというので継続してみます。すると

passenger-install-nginx-module・その3

足りない4つのソフトウェアについて、それぞれどのパッケージをインストールしたらいいか教えてくれます。ただし、この場合は先に ruby1.9.1 をインストールしているので、" ruby-dev " とあるのはまちがい。これは 1.8 系用なので、正しくは " ruby1.9.1-dev " です。

 ついでに言うと、この場合指定するパッケージは下記の2つだけでかまいません。

$ sudo apt-get install ruby1.9.1-dev libcurl4-openssl-dev

 これで残りの2つもいっしょにインストールされます(試してみた)。

 ではもう一度 passenger-install-nginx-module を実行します。

$ sudo passenger-install-nginx-module passenger-install-nginx-module・その4

 今度はすべて "yes" となりました。

 さらに表示は進んで

passenger-install-nginx-module・その5

となります。

 ここでどのようにインストールするのか 1 か 2 のどちらかを選択します( Ctrl-C で中断することもできます)。

 簡単に言うと、1 はお任せコース。Nginx のソースコード( Stable version )のダウンロード・展開からコンパイル・インストールをインストーラーが自動的にしてくれます。こちらでしなければいけないことは Nginx をインストールするディレクトリの指定だけです。

 2 はカスタマイズしたい人向け。Nginx のソースコードは自分で取ってきて展開しておく必要がありますし、以下の3点を指定しなければなりません。

  1. Nginx のソースコードを展開したディレクトリ
  2. Nginx をインストールするディレクトリ
  3. 追加する Nginx のオプション

 特に希望はない、というのであれば 1 がお手軽です。Stable version じゃなくて 最新の Mainline version を使いたいとか、オプションを変更したい、あるいはモジュールを追加したい場合は 2 を選択することになります。

 わたしは 2 を選択しましたので、以下、2 の流れを紹介します。

 なお、たくさんある Nginx のオプション・モジュールについての解説は、わたしの手に余りますのでここでは省略させていただきます。わたしが主に参考にした資料は「ハイパフォーマンス HTTP サーバ Nginx 入門」(クレマン・ネデルク:著 長尾高弘:訳 アスキー・メディアワークス)です。原著は2010年のものなので、少し時間が経ってしまっていて内容も古くなっている箇所はありますが、まだ十分有用だと思いますし、なんといっても2013年10月現在、Nginx の日本語解説書としてはほとんど唯一のものです。

 2 を選択するならその前に Nginx のダウンロードページ でインストールしたいバージョンのソースをダウンロードして適当なディレクトリに展開しておきます。Stable version が安定版なので、通常はこれでよいと思います。

 さて 2 を選択すると、インストーラーが自動的に PCRE というライブラリをダウンロード・インストールします(その処理の表示画面は長くなるので割愛)。

 PCRE のインストールが終わると下記の画面になり、ここで Nginx のソースコードを展開したディレクトリを指定します。

passenger-install-nginx-module・その6

 展開したディレクトリが /download/nginx なら

Please specify the directory: /download/nginx

と入力します。

 入力したら Enter を押して次の設定へ。

passenger-install-nginx-module・その7

 ここで Nginx をインストールするディレクトリを指定します。指定しない場合は /opt/nginx にインストールされます。インストールしたいディレクトリが /my/nginx なら

Please specify a prefix directory [/opt/nginx]: /my/nginx

と入力します。

 入力したらまた Enter を押して次の設定へ。

passenger-install-nginx-module・その8

 ここで追加したい Nginx のオプションを指定します。ない場合は指定しなくても構いません。

 追加する場合の例としてよくありそうなものを一つ挙げますと、設定ファイルの配置場所があります。

 デフォルトのままインストールしますと、インストールしたディレクトリの直下に conf ディレクトリが作られ、さらにその中に作られる nginx.conf が設定ファイルになるのですが、Linux の標準的な構成では各種設定ファイルは /etc 配下に置かれるものなので、これは好ましくないと考える方は少なくないでしょう。これを例えば /etc/nginx/nginx.conf に変更する場合は、次のようにします。

Extra arguments to pass to configure script: --conf-path='/etc/nginx/nginx.conf'

 オプションを複数指定する場合は、スペースで区切ってつなげます。オプション指定をすべて入力したらまた Enter を押します。

passenger-install-nginx-module・その9

 念押しで指定の確認があります。

  no を選択すると、オプション指定の表示に戻ります。 yes なら、コンパイル・インストールが始まります。

Is this what you want? (yes/no) [default=yes]:

 参考までに ウチのサーバー機 の場合、ここから10分以内でコンパイル・インストールが終了しました。

 コンパイル・インストール中に表示される内容については、ムッチャ長いので割愛(解説しろって言われてもできないしぃ)。

 コンパイル・インストールに成功した場合、下のように表示されます。

passenger-install-nginx-module・その10

 成功したこと以外にも、「 Nginx の設定ファイルに Passenger 用の下記のようなオプション

passenger_root /var/lib/gems/1.9.1/gems/passenger-4.0.19;
passenger_ruby /usr/bin/ruby1.9.1;

を追加してください」というメッセージがあります(赤字部分はバージョン番号ですので、インストールしたバージョンによって異なります)。Passenger を動かすために必要な部分です。ここは後で Nginx の設定で使いますので、どこかに記録しておきましょう。

 この状態で Enter を押すとさらにメッセージが出てきます。

passenger-install-nginx-module・その11

 Ruby on Rails 向けの設定例が表示されて、これで Passenger と Nginx のインストールはおしまい。

 ここで Nginx の起動確認をします。インストールしたディレクトリがデフォルトのままの /opt/nginx なら

$ sudo /opt/nginx/sbin/nginx

とコマンドを入力すれば、Nginx が起動するはずで、ブラウザで見て

Welcome to nginx!

と表示されれば正常に起動しています。

 起動が確認できたら

$ sudo /opt/nginx/sbin/nginx -s stop

で、いったん Nginx を停止し、次に RubyGems を使って Sinatra をインストールします。

$ sudo gem install sinatra

 インストールはこれで完了。ここからは Sinatra を動かすために必要な作業を行なっていきます。

 Sinatra のアプリを配置するディレクトリの中には public というディレクトリと config.ru というファイルが必須になります。

 public ディレクトリは画像や CSS などの静的ファイルを置く場所として使われます。

 config.ru は Ruby on Rails や Sinatra などの各種フレームワークを動かすための設定ファイルで、フレームワークの種類や環境により内容は異なります。あくまで一例ですが Ruby 1.9 系 + Sinatra の場合は下のようにすればよいと思います。

require 'sinatra'

						
set :environment, ENV['RACK_ENV'].to_sym
disable :run, :reload
require './app.rb'

 4行目に赤字で記載した app.rb が Sinatra のアプリケーションファイルになります(もちろんファイル名は別のものでもかまいません)。

 仮に Sinatra のアプリを配置するディレクトリを /var/www とし、config.ru を上記のとおりとするなら、最小のディレクトリ・ファイル構成は下図のようになります。

ディレクトリ・ファイル構成

 この構成を踏まえた Nginx の設定ファイル nginx.conf の内容は下のようになります。Sinatra を動かすために最低限必要な項目だけを設定しています。通常は他の項目(起動ユーザーや接続数上限とかログその他もろもろ)も設定するものですが、これでも動くことは動くと思います。

events {
}
http {
      passenger_root /var/lib/gems/1.9.1/gems/passenger-4.0.19;
      passenger_ruby /usr/bin/ruby1.9.1;
     server {
         listen 80;
         server_name localhost;
         root /var/www/public;
         passenger_enabled on;
     }
}

 赤字部分は前記・passenger-install-nginx-module がインストール完了時に例示するオプションを、そのまま転記します。

 黄字部分はドキュメントルートの設定( Apache の DocumentRoot に相当)ですが、ここで大事なことは必ず public ディレクトリを含めること。この場合、/var/www までとすると動作しません。

 これで準備はほぼ終了。あとは app.rb に Sinatra のアプリケーション を作成し、Nginx を再起動するだけです。

 では、例として簡単な Sinatra のアプリケーション を作って動かしてみます。

require 'sinatra'
get '/' do
    'Hello world!'
end

 上の内容で app.rb を作り、Nginx を再起動。

$ sudo /opt/nginx/sbin/nginx

 ブラウザに「Hello world!」と表示されたら成功です。お疲れ様。