Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
45
Help us understand the problem. What is going on with this article?
@pugiemonn

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

More than 5 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

45
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
pugiemonn
GoogleTagManagerを利用してGAを操るようなマーケターとしてお仕事しています
pugiemonn_com
pugiemonn.com

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
45
Help us understand the problem. What is going on with this article?