和洋風KAI

【Ruby】Sinatra + Unicorn + Nginxでのデプロイ手順メモ。

Photo by: Dev Bootcamp

いやーいいですねー。Sinatra。

Railsだとよっこらしょという感じになりますが、Sinatraだとサクッとはじめられるのが快適すぎです。

簡単なスクリプトやブックマークレットを作るなら全部Sinatraでいいなと。CGIで動かすよりもデバッグも楽ですしね。Viewも簡単に作れるのでホント楽だなと。

しかし、Sinatraを使うとデプロイという作業が必要になります。(Railsも必要ですが。)

これがどハマりしまして。Nginxという環境のせいか、なかなかググっても解決作が出てこない。

あまりにもハマったので、デプロイ手順をメモしておきたいと思います。

Sinatra + Unicorn + Nginxでのデプロイ手順メモ。

1. Sinatraアプリのフォルダ直下に、以下のフォルダを追加する。

2. Sinatraアプリのフォルダ直下に、Gemfileを作り、以下のgemを追加。

gem 'sinatra'
gem 'sinatra-contrib'
gem 'unicorn'

3. Sinatraアプリのフォルダ直下に、unicorn.rbを用意。コードは以下のとおり。

@dir = "[Sinatraアプリが置いてあるフォルダへのパス]"
worker_processes 2
working_directory @dir
preload_app true
timeout 30
listen "#{@dir}/tmp/[Sinatraアプリのフォルダ名].sock", :backlog => 64
pid "#{@dir}/tmp/pids/unicorn.pid"
stderr_path "#{@dir}/log/unicorn.stderr.log"
stdout_path "#{@dir}/log/unicorn.stdout.log"

4. Sinatraアプリのフォルダ直下に、config.ruを用意。コードは以下のとおり。

require './[Sinatraアプリのスクリプト名]'
run Sinatra::Application

5. nginx.confに以下のコードを追記。(sudo vim /etc/nginx/nginx.conf)

location / {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://[Sinatraアプリのフォルダ名];
}
upstream [Sinatraアプリのフォルダ名] {
server unix:[Sinatraアプリが置いてあるフォルダへのパス]/tmp/[Sinatraアプリのフォルダ名].sock;
}

* サブディレクトリに設置する場合は、locationを、location /[Sinatraアプリのフォルダ名]とすること。

6. コマンドで、Nginxを再起動して新しい設定を読み込む。

sudo service nginx restart

7. Sinatraアプリをサーバにアップロードする。

8. コマンドでGemをインストール。

bundle install

9. Sinatraアプリを起動。

bundle exec unicorn -E production -c unicorn.rb -D

10. 該当するURLにアクセスして表示されたらデプロイは完了。

11. Sintraアプリをストップする場合は以下のコマンドを。

cat [Sinatraアプリが置いてあるフォルダへのパス]/tmp/pids/unicorn.pid | xargs kill -QUIT

注意: 上手く動かない場合、unicornのlistenと、nginx.confのupstreamがちゃんと同じか確認すること。
注意: Sinatraがnot_foundを拾う場合は、ドメイン直下からの相対パスがされているか確認すること。

あとがき


という手順を踏んでようやくデプロイできました。

なかなか、Sinatra + Unicorn + Nginxという環境でのデプロイ手順がなかったように思うので、この記事が参考になればこれ幸いです。

ちなみに、なぜかこの手順を踏んで、Sinatraのnot_foundメソッドにいつも辿り着いてしまうという現象が起きたのですが(サブディレクトリに設置)、無事解決しました。パスがあってなかったということですね。同じ現象にはまった方は参考になればこれ幸いです。(元うなぎ屋さん大変感謝いたします!)

現役エンジニアのオンライン家庭教師CodeCamp