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/以下にあるようなスクリプトよりだいぶシンプルに書けるので積極的に使っている。他にもいろいろとメリットがあるらしいが、正直よくわからない。

Ubuntu10.04LTS+nginx+php-fpmでwordpressやCakePHPを動かす

現状、Apache+mod_phpをnginxで置き換えるとすると、nginx+spawn-fcgi+php-cgiを使ってる人が多いと思うんだけど、Ubuntuの公式リポジトリだとnginxのバージョンが低く(0.7系)、spawn-fcgiはinit.dスクリプトを書くかdaemontools使わなきゃいけないし、Apache+mod_phpみたいにインストール一発で動かせないので割とメンドクサイ。

同じこと思ってる人はnginxチームが提供しているaptリポジトリを使うと、nginx1.0.2+php5.3.5+php-fpmをaptでインストールできるので楽になりますよ。

既にnginxがインストールされている場合は念のためremoveしておく、spawn-cgiなどはkillしておきましょう。 以下、手順。

# nginxリポジトリを登録
$ sudo echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu lucid main" > /etc/apt/sources.list.d/nginx-stable-lucid.list
$ sudo echo "deb http://ppa.launchpad.net/nginx/php5/ubuntu lucid main" > /etc/apt/sources.list.d/nginx-stable-lucid.list
$ sudo echo "deb-src http://ppa.launchpad.net/nginx/php5/ubuntu lucid main" > /etc/apt/sources.list.d/nginx-stable-lucid.list
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
# aptitudeのリストを更新
$ sudo aptitude update
# nginxをインストール
$ sudo aptitude install nginx
# PHP関連をインストール
$ sudo aptitude install php5 php5-cgi php5-cli php5-mysql php5-memcached php5-gd php5-curl php-pear php-apc php-fpm

インストールできたら、プロセスを確認してみる。

$ ps aux | grep nginx
root     14051  0.0  0.1  71092  1568 ?        Ss   May28   0:00 nginx: master process /usr/sbin/nginx
www-data 14052  0.1  0.2  72496  3568 ?        S    May28   3:47 nginx: worker process

$ ps aux | grep php
root     14238  0.0  0.3 182432  4944 ?        Ss   May28   0:25 php-fpm: master process (/etc/php5/fpm/main.conf)      
www-data 14255  0.1  3.1 192428 48292 ?        S    May28   4:54 php-fpm: pool www                                      
www-data 14256  0.1  4.0 207328 62988 ?        S    May28   4:43 php-fpm: pool www                                      
www-data 14258  0.1  3.8 202720 59212 ?        S    May28   4:36 php-fpm: pool www                                      
www-data 14291  0.1  3.6 199648 55496 ?        S    May28   4:39 php-fpm: pool www                                      
www-data 14293  0.1  3.3 196576 52260 ?        S    May28   4:51 php-fpm: pool www                                      
www-data 14294  0.1  3.4 196576 52952 ?        S    May28   4:47 php-fpm: pool www                                      
www-data 14297  0.1  4.5 214756 70368 ?        S    May28   4:34 php-fpm: pool www                                      
www-data 14298  0.1  3.1 192336 48900 ?        S    May28   4:46 php-fpm: pool www                                      
www-data 14299  0.1  3.1 192332 48856 ?        S    May28   5:05 php-fpm: pool www                                      
www-data 14300  0.1  2.9 191044 46132 ?        S    May28   4:58 php-fpm: pool www                                      

ちゃんとユーザーwww-dataでphp-fpmのプロセスが起動されてますね。一番上のrootで実行されているのでphp-fpmの子プロセスを管理してるマスタープロセスです。起動していないければsudo service nginx startとsudo service php-fpm startで起動させて再度確認します。 起動するプロセス数やfastcgiのlisten URLなどは/etc/php5/php-fpm/pool.d/www.confにて設定します。

次に、nginxのバーチャルホストの設定。 下の設定だとwordpressとCakePHPは動くはず。

# /etc/nginx/sites-avilable/example.com

# www.example.comへのアクセスをexample.comへリダイレクト
server {
  listen 80;
  server_name www.example.com;
  rewrite ^(.*) http://example.com$1 permanent;
}
server {
  listen   80;
  server_name  example.com;

  access_log  /var/log/nginx/example.com.access.log;
  error_log  /var/log/nginx/example.com.error.log;

  root   /var/www/example.com;
  index  index.php index.html;

  try_files $uri $uri/ /index.php?q=$1;

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$faswww.example.comへのアクセスをexample.comへリダイレクト
server {
  listen 80;
  server_name www.example.com;
  rewrite ^(.*) http://example.com$1 permanent;
}
server {
  listen   80;
  server_name  example.com;

  access_log  /var/log/nginx/example.com.access.log;
  error_log  /var/log/nginx/example.com.error.log;

  root   /var/www/example.com;
  index  index.php index.html;

  try_files $uri $uri/ /index.php?q=$1;

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  }

  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  location ~ /\.ht {
    deny  all;
  }
}

この内容を/etc/nginx/sites-available/example.comに保存し、/etc/nginx/sites-enabled/example.comからシンボリックリンクを張ります。

$ sudo vi /etc/nginx/sites-available/example.com
$ sudo ln -s /etc/nginx/sites-availabe/example.com /etc/nginx/sites-enabled/example.com

ここまでやったらnginxとphp-fpmを再起動して、http://example.comをブラウザで開き、正常に動けばOKです。