Sinatraアプリをunicornで動かす

まずは専用のユーザーを作る。

takatoh@nightschool $ sudo adduser sombrero
ユーザー `sombrero' を追加しています...
新しいグループ `sombrero' (1001) を追加しています...
新しいユーザー `sombrero' (1001) をグループ `sombrero' に追加しています...
ホームディレクトリ `/home/sombrero' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
sombrero のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: sombrero
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y

新しいユーザー sombrero に sudo する権限をつける。

takatoh@nightschool $ sudo gpasswd -a sombrero sudo
[sudo] password for takatoh: 
ユーザ sombrero をグループ sudo に追加

ユーザー sombrero でログインしなおして、Ruby と Git のバージョンを確認。

sombrero@nightschool:~$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
sombrero@nightschool:~$ git --version
git version 1.9.1

GitHub から Sombrero を clone。

sombrero@nightschool:~$ git clone [email protected]:takatoh/sombrero.git
Cloning into 'sombrero'...
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
remote: Reusing existing pack: 903, done.
remote: Total 903 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (903/903), 282.66 KiB | 131.00 KiB/s, done.
Resolving deltas: 100% (577/577), done.
Checking connectivity... done.

必要なライブラリをインストール。

sombrero@nightschool:~$ cd sombrero
sombrero@nightschool:~/sombrero$ sudo bundle install
[sudo] password for sombrero: 
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Fetching gem metadata from https://rubygems.org/..........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing tilt 1.4.1
Installing haml 4.0.5
Using httpclient 2.4.0
Installing rack 1.5.2
Installing rack-protection 1.5.3
Installing sass 3.3.9
Installing sequel 4.12.0
Installing sinatra 1.4.5
Installing sqlite3 1.3.9
Using bundler 1.6.3
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from haml:

HEADS UP! Haml 4.0 has many improvements, but also has changes that may break
your application:

* Support for Ruby 1.8.6 dropped
* Support for Rails 2 dropped
* Sass filter now always outputs <style> tags
* Data attributes are now hyphenated, not underscored
* html2haml utility moved to the html2haml gem
* Textile and Maruku filters moved to the haml-contrib gem

For more info see:

http://rubydoc.info/github/haml/haml/file/CHANGELOG.md

もともと運用していたディレクトリからアプリの設定ファイルをコピー。

sombrero@nightschool:~/sombrero$ cp /home/takatoh/w/sombrero/config.yaml .

データベースのマイグレーションを実行。

sombrero@nightschool:~/sombrero$ rake db:migrate
プログラム 'rake' はまだインストールされていません。 次のように入力することでインストールできます:

rake が入ってなかった。インストール。

sombrero@nightschool:~/sombrero$ sudo gem install rake
Fetching: rake-10.3.2.gem (100%)
Successfully installed rake-10.3.2
1 gem installed
Installing ri documentation for rake-10.3.2...
Installing RDoc documentation for rake-10.3.2...

もともとの運用元から、データベースファイルをコピー(上書き)。

sombrero@nightschool:~/sombrero$ sudo cp /home/takatoh/w/sombrero/db/sombrero.db db

ここでいったん、アプリが正常に起動するか確認。

sombrero@nightschool:~/sombrero$ rackup app.ru --port 9000

OK。

Unicorn のインストール。

sombrero@nightschool:~/sombrero$ sudo gem install unicorn
[sudo] password for sombrero: 
Fetching: kgio-2.9.2.gem (100%)
Building native extensions.  This could take a while...
Fetching: raindrops-0.13.0.gem (100%)
Building native extensions.  This could take a while...
Fetching: unicorn-4.8.3.gem (100%)
Building native extensions.  This could take a while...
Successfully installed kgio-2.9.2
Successfully installed raindrops-0.13.0
Successfully installed unicorn-4.8.3
3 gems installed
Installing ri documentation for kgio-2.9.2...
Installing ri documentation for raindrops-0.13.0...
Installing ri documentation for unicorn-4.8.3...
Installing RDoc documentation for kgio-2.9.2...
Installing RDoc documentation for raindrops-0.13.0...
Installing RDoc documentation for unicorn-4.8.3...

いろいろググった結果を見ると Unicorn の前に nginx をたてるのが普通のようだけど、今回は Unicorn のみで行く。公式サイト(?)によれば、アプリのルートディレクトリで unicorn と打てば起動するらしい。

sombrero@nightschool:~/sombrero$ unicorn
/var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:659:in parse_rackup_file': rackup file (config.ru) not readable (ArgumentError)
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:77:in reload'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:68:in initialize'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in new'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in initialize'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/bin/unicorn:126:in new'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/bin/unicorn:126:in new'
	from /usr/local/bin/unicorn:23:in load'
	from /usr/local/bin/unicorn:23:in main'

あれ、ダメだ。あ、rackup のファイルが config.ru じゃなきゃだめなのか。引数に与えてみるか。

sombrero@nightschool:~/sombrero$ unicorn app.ru
I, [2014-07-26T09:26:00.893170 #19156]  INFO -- : listening on addr=0.0.0.0:8080 fd=7
I, [2014-07-26T09:26:00.893297 #19156]  INFO -- : worker=0 spawning...
I, [2014-07-26T09:26:00.893751 #19156]  INFO -- : master process ready
I, [2014-07-26T09:26:00.894064 #19158]  INFO -- : worker=0 spawned pid=19158
I, [2014-07-26T09:26:00.894233 #19158]  INFO -- : Refreshing Gem list
I, [2014-07-26T09:26:01.337048 #19158]  INFO -- : worker=0 ready

今度は無事起動。ポート8080で待機している。今までどおり 9000番ポートで動かすには –port 9000 をオプションとしてつけてやればいいようだ。

Unicorn の設定ファイル unicorn.conf を書く。

listen "9000"
worker_processes 1
pid "./unicorn.pid"
stderr_path "./unicorn.log"
stdout_path "./unicorn.log"

どうも rackup するファイルは設定できないみたいだ。でも、unicorn コマンドの引数に与えてやれば、これで起動してみると、ちゃんと起動しているのが確認できた。

sombrero@nightschool:~/sombrero$ unicorn app.ru -c unicorn.conf

さて、今度はPCを起動したら自動で起動するようにする。それには /etc/init.d 配下に起動用のスクリプトを置く。

#!/bin/sh

PATH=/sbin:/usr/local/bin:/usr/bin
SOMBRERO_ROOT=/home/sombrero/sombrero

case "$1" in
start)
    cd ${SOMBRERO_ROOT}
    unicorn app.ru -c unicorn.conf -D
    ;;
stop)
    PID=`cat ${SOMBRERO_ROOT}/unicorn.pid`
    kill -QUIT ${PID}
    ;;
*)
    echo "Usage: sombrero {start|stop}" &gt;&amp;2
    exit 1
    ;;
esac

exit 0

unicorn についてる -D オプションはデーモン化するためのもの。
で、これをデーモン(サービス)として起動するには、OS のランレベルに応じた /etc/rc?.d フォルダの中に ‘S’ で始まるファイル名でソフトリンクを作ってやればいいらしい。もっとも、この部分は sysv-rc-conf というツールを使うのが通例のようだ。
それじゃ、まずランレベルの確認。

sombrero@nightschool:~$ runlevel
N 2

N が以前のランレベルで、2が現在のランレベルを示しているらしい。以前のランレベルってなんだかわからないけど今回はパス。とにかく現在のランレベルが 2 だということがわかった。
つぎ、sysv-rc-conf のインストール。

sombrero@nightschool:~$ sudo apt-get install sysv-rc-conf

で、この sysv-rc-conf を sudo つきで起動すると下のような画面になる。

sysv-rc-conf

よくわからないけど、sombrero の行の 2 のカラムのところに X 印をつけて保存して終了。
/etc/rc2.d フォルダを確認してみると、S20sombrero という名前でファイル(ソフトリンク)ができているのが確認できる。

sombrero@nightschool:~$ ls -l /etc/rc2.d
合計 4
-rw-r--r-- 1 root root 677  3月 13 10:42 README
lrwxrwxrwx 1 root root  20  7月  5 14:26 S20kerneloops -> ../init.d/kerneloops
lrwxrwxrwx 1 root root  15  7月  5 14:26 S20rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root  18  7月 26 11:58 S20sombrero -> ../init.d/sombrero
lrwxrwxrwx 1 root root  27  7月  5 14:26 S20speech-dispatcher -> ../init.d/speech-dispatcher
lrwxrwxrwx 1 root root  15  7月  5 14:26 S50saned -> ../init.d/saned
lrwxrwxrwx 1 root root  19  7月  5 14:26 S70dns-clean -> ../init.d/dns-clean
lrwxrwxrwx 1 root root  18  7月  5 14:26 S70pppd-dns -> ../init.d/pppd-dns
lrwxrwxrwx 1 root root  21  7月  5 14:26 S99grub-common -> ../init.d/grub-common
lrwxrwxrwx 1 root root  18  7月  5 14:26 S99ondemand -> ../init.d/ondemand
lrwxrwxrwx 1 root root  18  7月  5 14:26 S99rc.local -> ../init.d/rc.local

さあ、これで OK のはずだ。果たして PC を再起動してみると、自動的に起動しているのが確認できた。

今日はここまで。