いやーいいですねー。Sinatra。
Railsだとよっこらしょという感じになりますが、Sinatraだとサクッとはじめられるのが快適すぎです。
簡単なスクリプトやブックマークレットを作るなら全部Sinatraでいいなと。CGIで動かすよりもデバッグも楽ですしね。Viewも簡単に作れるのでホント楽だなと。
しかし、Sinatraを使うとデプロイという作業が必要になります。(Railsも必要ですが。)
これがどハマりしまして。Nginxという環境のせいか、なかなかググっても解決作が出てこない。
あまりにもハマったので、デプロイ手順をメモしておきたいと思います。
Sinatra + Unicorn + Nginxでのデプロイ手順メモ。
1. Sinatraアプリのフォルダ直下に、以下のフォルダを追加する。
- /tmp
- /tmp/pids
- /tmp/sockets
- /log
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メソッドにいつも辿り着いてしまうという現象が起きたのですが(サブディレクトリに設置)、無事解決しました。パスがあってなかったということですね。同じ現象にはまった方は参考になればこれ幸いです。(元うなぎ屋さん大変感謝いたします!)