Edited at

UbuntuでRailsとUnicorn、Nginxの環境を構築しました

More than 3 years have passed since last update.

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を利用しています。


rbenvとruby-buildをインストール

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をインストール

# 最初は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をインストール


Bundler+Unicorn+Railsをインストール

gem install bundler

gem install unicorn
gem install rails
rails -v
Rails 4.2.1

Railsがインストールされました。


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 というディレクトリが無かったので作りました。そのため環境に応じてユーザー権限を変更する必要がでてしまいました。


therubyracerを有効にする

# demo-appディレクトリへ移動

cd demo-app

# Gemfileの編集
vi Gemfile
gem 'therubyracer', platforms: :ruby


therubyracerの行のコメントを外し、有効にします。


Gemfileに書かれたgemをインストールする

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というファイルを作成するようです。


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ディレクトリを作成します。


pidsディレクトリを作成

mkdir pids


pidsディレクトリのフルパスは /var/www/demo-app/pids になります。


Nginxをインストール

Nginxをインストールします。


Nginxをインストールする

sudo apt-get install nginx

sudo service nginx start

Nginxがインストールされ起動します。


Nginxの設定

Nginxの設定を書きます。defaultを編集しているのがまずい方は適宜設定してください。


Nginxの設定を書く

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を起動

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のログです。


Nginxのログを確認

tail -f /var/log/nginx/access.log 

# もしくは
tail -f /var/log/nginx/error.log



Unicornのログを確認

UnicornのログはRailsプロジェクトの中に出力されていました。


Unicornのログを確認する

tail -f /var/www/demo-app/log/unicorn.log



NginxとUnicornにログがでないケース

NginxとUnicornにログがでていない場合、クラウドのセキュリティグループやファイアーウォール、ポートフォワード設定の問題でした。


おまけ:クラウドサービスでインストール手順の検証

今回、この手順を試すために、AWSIDCFクラウドさくらクラウドの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