UbuntuでRails環境をUnicornとNginxで構築をしました。
環境
- Ubuntu
- Rails
- Rbenv
- Nginx
- Unicorn
上記のインストール手順を試しました。
パッケージインストール
apt-getコマンドでパッケージをインストールしました。
sudo apt-get update
sudo apt-get install curl git-core build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libcurl4-openssl-dev libxml2-dev libxslt1-dev python-software-properties
色々パッケージをインストールしています。これらを入れておかないと、例えばrbenvをインストールしようとしようとしたときに、skip installing bundle gems because of lacking zlib
などの問題がでました。
rbenvのインストール
Ruby環境を作成するためにrbenvを利用しています。
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
.bashrcを有効にしたいので、一旦コンソールから抜けsshで入り直しました。source ~/.bashrc
でも動作しました。
Rubyのインストール
Rubyをインストールします。もともと入っているRubyのバージョンは環境により異なるかもしれません。
# 最初はruby 1.9.3
ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
# 新しいRuby 2.2.2
rbenv install 2.2.2
rbenv global 2.2.2
ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
入っていたRubyは1.9.3でしたが、rbenv経由のRubyにしたところ2.2.2になりました。
この記事でインストールしたRubyのバージョンは2.2.2になっています。バージョンを変えたい際、あるいはrbenvでインストールできるバージョンは rbenv install -l
コマンドで確認することができます。
BundlerとUnicornとRailsをインストール
gem install bundler
gem install unicorn
gem install rails
rails -v
Rails 4.2.1
Railsがインストールされました。
Railsプロジェクトを作成
Railsのプロジェクトを作ります。
# wwwディレクトリの作成と移動
sudo mkdir /var/www
# ubuntuというユーザーの場合
sudo chown ubuntu /var/www
cd /var/www/
# demo-appというRailsプロジェクトを作成
rails new demo-app
rails new
コマンドでプロジェクトを作成します。/var/www
というディレクトリが無かったので作りました。そのため環境に応じてユーザー権限を変更する必要がでてしまいました。
# demo-appディレクトリへ移動
cd demo-app
# Gemfileの編集
vi Gemfile
gem 'therubyracer', platforms: :ruby
therubyracerの行のコメントを外し、有効にします。
bundle install
therubyracer
などのgemがインストールされるはずです。
もしtherubyracer
をインストールしていないとrake db:migrate
などを実行した時にエラーがでました。あるいは以下のようなエラーが出る場合もtuerubyracer
を入れると動きました。
ERROR -- : Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
Unicornの設定ファイルを作成
Unicornの設定はconfig/unicorn.rbというファイルを作成するようです。
vi config/unicorn.rb
# config/unicorn.rb
# Set the working application directory
# working_directory '/path/to/your/app'
working_directory '/var/www/demo-app'
# Unicorn PID file location
# pid '/path/to/pids/unicorn.pid'
pid '/var/www/demo-app/pids/unicorn.pid'
# Path to logs
# stderr_path '/path/to/log/unicorn.log'
# stdout_path '/path/to/log/unicorn.log'
stderr_path '/var/www/demo-app/log/unicorn.log'
stdout_path '/var/www/demo-app/log/unicorn.log'
# Unicorn socket
# listen '/tmp/unicorn.[application name].sock'
listen '/tmp/unicorn.demo-app.sock'
# Number of processes
# worker_processes 4
worker_processes 2
# Time-out
timeout 30
unicorn.rbで指定している、pidsディレクトリを作成します。
mkdir pids
pidsディレクトリのフルパスは /var/www/demo-app/pids
になります。
Nginxをインストール
Nginxをインストールします。
sudo apt-get install nginx
sudo service nginx start
Nginxがインストールされ起動します。
Nginxの設定
Nginxの設定を書きます。defaultを編集しているのがまずい方は適宜設定してください。
sudo vim /etc/nginx/sites-available/default
upstream app {
# Path to Unicorn SOCK file, as defined previously
server unix:/tmp/unicorn.demo-app.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /var/www/demo-app/public;
index index.html index.htm;
# Make site accessible from http://localhost/
try_files $uri/index.html $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
error_page 500 502 503 504 /500.html;
#client_max_body_size 4G;
keepalive_timeout 10;
}
Unicornを起動
unicorn_rails -c config/unicorn.rb -D
sudo service nginx restart
# Unicornのプロセスを確認
ps ax | grep rails
32704 ? Sl 0:00 unicorn_rails master -c config/unicorn.rb -D
32707 ? Sl 0:01 unicorn_rails worker[0] -c config/unicorn.rb -D
32709 ? Sl 0:01 unicorn_rails worker[1] -c config/unicorn.rb -D
unicorn_railsのプロセスが確認できました。Unicornが動いています。Unicornを停止するときはkill
コマンドでプロセスを指定しました。
あとはブラウザからアクセスしてRailsのデフォルト画面が見えたら成功です。

エラーログの確認
この記事に書いたRails+Unicorn+Nginxの手順でなにか躓いたときには、ログを確認したところ解決の助けになりました。
Nginxのログを確認
まず確認するべきはNginxのログです。
tail -f /var/log/nginx/access.log
# もしくは
tail -f /var/log/nginx/error.log
Unicornのログを確認
UnicornのログはRailsプロジェクトの中に出力されていました。
tail -f /var/www/demo-app/log/unicorn.log
NginxとUnicornにログがでないケース
NginxとUnicornにログがでていない場合、クラウドのセキュリティグループやファイアーウォール、ポートフォワード設定の問題でした。
おまけ:クラウドサービスでインストール手順の検証
今回、この手順を試すために、AWS
とIDCFクラウド
、さくらクラウド
の3つそれぞれで、Ubuntuを選択して環境を構築しました。
クラウドサービスを使用すると、デフォルトの設定でport80や22などが開いていない場合があります。その際には、セキュリティ設定を変えておく必要があります。
AWS
ではセキュリティグループ
の設定、IDCFクラウド
ではファイアーウォール
とポートフォワード
の設定を確認することで助けになります。さくらクラウド
ではファイアーウォールなどでportをいじらなくても動きました。
さくらはSSDだったせいかインストールが早かった気がします(☝ ՞ਊ ՞)
参考
だいたい参考ページのままです(☝ ՞ਊ ՞)
http://blog.mccartie.com/2014/08/28/digital-ocean.html
http://www.cubicleapps.com/articles/ubuntu-rails-ready-with-nginx-unicorn