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

  • 33
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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