AWS(Amazon EC2)上のLinuxでtimezoneを設定する

EC2の各regionで使えるofficialなUbuntu AMIのインスタンスでは、デフォルトでは日本時間に設定されていない。当然だけど。

us-westなら西海岸、us-eastなら東海岸とregionの物理的な位置に合わせてtimezoneが設定されているかどうかは未確認だけど、これは単純にTimezoneの設定の問題なので、下記のようにすればよい。

$ sudo dpkg-reconfigure tzdata

こうするとTimezoneの設定画面が出てくるので、Asia/Tokyoの順に選択してあげればよい。 同じ問題におけるRHEL系の解決方法として

$ cp /usr/share/zoneinfo/Japan /etc/localtime

っていうのが紹介されてるけど、Ubuntuの場合これをやっても再起動すると元に戻ってしまうのでやっぱり上記の方法の方がいいです。

CentOSやUbuntuでrbenv+unicorn+rails

追記: 20120405

起動スクリプトのオプションが間違っていたので修正。

--cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru
++cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -E production $app_root/config.ru

以下本文

複数バージョンのrubyを共存させるツールとして、過去にはRVMを使っていたが少し前にrbenvに変えた。Rails3世代になり、RVMのgemsetはbundlerで代替可能になったので、RVMの豊富な機能が少し邪魔に感じたので。同時に、サーバーサイドでも管理が簡単なのでrbenvを使うようにした。あまり推奨はされてないようだけど。

rbenvの通常インストール方法はsstephenson/rbenv - GitHubにあるのでそちらを参照するとよい。

また、rbenvで使うrubyインストーラーであるsstephenson/ruby-build - GitHubも一緒に使うとすごく便利。

以下、サーバーで行った作業のログをメモ。

# rbenvインストール
$ git clone git://github.com/sstephenson/rbenv.git /usr/share/rbenv

# profile.dにrbenvの設定を追加
$ vi /etc/profile.d/rbenv.sh
# ここから
export PATH="/usr/share/rbenv/bin:$PATH"
export RBENV_VERSION=ree-1.8.7-2011.12
export RBENV_DIR=/usr/share/rbenv
export RBENV_ROOT=/usr/share/rbenv
eval "$(rbenv init -)"
# ここまで

# /etc/profile.d/rbenv.shに実行権限を与える
$ chmod 755 /etc/profile.d/rbenv.sh

# 一旦上記設定を読み込む
$ source /etc/profile.d/rbenv.sh

# ruby-buildインストール
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ ./install.sh

# 今回はREE1.8.7をインストール
$ rbenv install ree-1.8.7-2011.12

# REE1.8.7をデフォルトで使用する
$ rbenv global ree-1.8.7-2011.12

と、ここまででrbenvのセットアップは完了。動作確認のために、一度シェルを再起動した上でrubyのバージョンを確認してみる。

$ ruby -v
ruby 1.8.7 (2011-12-28 MBARI 8/0x8770 on patchlevel 357) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.12

正しくREEが使われることが確認できた。あとは、gemでrailsとunicorn_railsをインストールすればよい。

rbenv上のREEでunicornを起動するには、以下のようなスクリプトを作ればよい。

app_root=/var/www/rails_application
rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin
cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru

普段はUpstartでrespawnや自動起動などをしているが、その場合 /etc/init/以下に次のような設定ファイルを作ればいい。これは、アプリケーションごとに1つのファイルになるので、例えばアプリケーション名がRailsAppならばRailsApp.confなどとする。

#!/bin/sh
description "Rails Application"
start on runlevel [2345]

script
  app_root=/var/www/rails_application
  rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin
  cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c 
  $app_root/config/unicorn.conf.rb -e production $app_root/config.ru >> /tmp/upstart.log 2>&1
end script

respawn

このアプリケーションの起動や終了はLinuxの場合ディストリビューションによって変わるが、大体の場合以下のようなコマンドで実行できるので自分の環境に最適なものを選択する。

# 起動
$ sudo service railsapp start
# または
$ sudo initctl start railsapp

# 終了
$ sudo service railsapp stop
# または
$ sudo initctl stop railsapp

UpstartはUbuntu10.04、CentOS6、Amazon Linuxなどで使える。従来の/etc/init.d/以下にあるようなスクリプトよりだいぶシンプルに書けるので積極的に使っている。他にもいろいろとメリットがあるらしいが、正直よくわからない。