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

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

# 環境
* Ubuntu
* Rails
* Rbenv
* Nginx
* Unicorn

上記のインストール手順を試しました。

# パッケージインストール
apt-getコマンドでパッケージをインストールしました。

```bash:パッケージのインストール
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を利用しています。

```bash: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のバージョンは環境により異なるかもしれません。

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

```bash:Bundler+Unicorn+Railsをインストール
gem install bundler
gem install unicorn
gem install rails
rails -v
Rails 4.2.1
```
Railsがインストールされました。

# Railsプロジェクトを作成
Railsのプロジェクトを作ります。

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

```ruby:therubyracerを有効にする
# demo-appディレクトリへ移動
cd demo-app

# Gemfileの編集
vi Gemfile
gem 'therubyracer', platforms: :ruby
```
therubyracerの行のコメントを外し、有効にします。


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

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

```bash:pidsディレクトリを作成
mkdir pids
```
pidsディレクトリのフルパスは `/var/www/demo-app/pids` になります。

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

```bash:Nginxをインストールする
sudo apt-get install nginx
sudo service nginx start
```
Nginxがインストールされ起動します。

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

```bash: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を起動

```bash: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のデフォルト画面が見えたら成功です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/15779da9-e42b-15d9-b7f6-d63bbdc07a89.png" width="320">
見えました。

# エラーログの確認
この記事に書いたRails+Unicorn+Nginxの手順でなにか躓いたときには、ログを確認したところ解決の助けになりました。

## Nginxのログを確認
まず確認するべきはNginxのログです。

```bash:Nginxのログを確認
tail -f /var/log/nginx/access.log 

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

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

```bash:Unicornのログを確認する
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