[AWS] EC2+RDS開発環境設定　Nginx+Unicorn+Ruby2.3+Rails4.2+MySQL5.5

AWSに以下の環境を構築したので、備忘録として残しておこうと思います。

(0)[AWSの設定] (http://qiita.com/hibriiiiidge/items/aebcd4184c7ab4c83bdf)
(1)[Apache2.2+PHP7+MySQL5.6+WordPress4.7+phpMyAdmin4.6](http://qiita.com/hibriiiiidge/items/7483335bb3d2fef40214)
(2)Nginx+Unicorn+Ruby2.3+Rails4.7+MySQL5.5 ←　本エントリの内容

実施事項
◎Ruby、Railsの設定
◎MySQLの設定
◎Unicornの設定
◎Nginxの設定
◎"Hello World"の表示


【ご一読いただくにあたって】
・EC2、RDS等々の設定は済ませておいて下さい。
　まだの方はこちらから　→　[AWSの設定] (http://qiita.com/hibriiiiidge/items/aebcd4184c7ab4c83bdf)
・間違いがありましたらコメントにて教えて下さい。（まだまだ勉強中です。）
・専門用語の深い解説はしておりません。
・通常デプロイはgithub等を絡めてデプロイすると思いますが、当エントリではとりあえず本番環境(production)を作る目的で進んでいきます。


##EC2の設定
###アップデート、ユーザ追加等の下準備

sshでEC2へアクセスした状態

```

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
3 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-86 ~]$ sudo yum update

~アップデート~

総ダウンロード容量: 51 M
Is this ok [y/d/N]: y
（途中、確認されますが[y]を入力）

完了しました!
[ec2-user@ip-10-0-1-86 ~]$ sudo su - #スーパーユーザへ切替
[root@ip-10-0-1-86 ~]# useradd myname #ユーザ追加
[root@ip-10-0-1-86 ~]# passwd myname #ユーザパスワード設定
Changing password for user myname.
New password: （パスワード入力）
Retype new password: （再入力）
passwd: all authentication tokens updated successfully. #成功
[root@ip-10-0-1-86 ~]# sudo visudo #追加したユーザに権限付与

=ファイル編集画面=

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
myname  ALL=(ALL)       ALL  (←rootの下に追加)

===============

[root@ip-10-0-1-86 ~]# exit #スーパーユーザ　ログアウト
logout
[ec2-user@ip-10-0-1-86 ~]$ su - myname #追加したユーザに切替
パスワード:
[myname@ip-10-0-1-86 ~]$
```

##Ruby,Railsのインストール
###git,rbenvのインストール

```
[myname@ip-10-0-1-86 ~]$ sudo yum -y install git
[myname@ip-10-0-1-86 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv #rbenvインストール
[myname@ip-10-0-1-86 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build #ruby-buildインストール
[myname@ip-10-0-1-86 ~]$ sudo vi .bash_profile　#.bash_profileの編集

=ファイルの編集画面=

export PATH
export PATH="$HOME/.rbenv/bin:$PATH" ←　追加
eval "$(rbenv init -)" ←　追加

=================

[myname@ip-10-0-1-86 ~]$ source ~/.bash_profile #環境変数の反映
[myname@ip-10-0-1-86 ~]$ rbenv -v #バージョン確認
rbenv 1.1.0-2-g4f8925a
```
[rbenvとは？](http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)
[rbenv + ruby-build はどうやって動いているのか](http://takatoshiono.hatenablog.com/entry/2015/01/09/012040)
[Linux | source コマンドは何をしているのか](http://qiita.com/YumaInaura/items/00437e6ab14d96adb71f)

###Ruby2.3.3のインストール

```
[myname@ip-10-0-1-86 ~]$ sudo yum install -y gcc
[myname@ip-10-0-1-86 ~]$ sudo yum install -y openssl-devel readline-devel zlib-devel
[myname@ip-10-0-1-86 ~]$ rbenv install 2.3.3
```

###Rails4.2.7のインストール
railsを展開するディレクトリを生成　(/var/www/railsに展開)

```
[myname@ip-10-0-1-86 ~]$ cd /var
[myname@ip-10-0-1-86 var]$ sudo mkdir www #wwwディレクトリの生成
[myname@ip-10-0-1-86 var]$ cd www
[myname@ip-10-0-1-86 www]$ sudo mkdir rails #railsディレクトリの生成
[myname@ip-10-0-1-86 www]$ sudo chown -R takahashi:takahashi rails #railsディレクトリのオーナー変更
[myname@ip-10-0-1-86 www]$ cd rails
[myname@ip-10-0-1-86 rails]$ rbenv local 2.3.3 #railsディレクトリのruby変更
[myname@ip-10-0-1-86 rails]$ ruby -v #バージョン確認
ruby 2.3.3p222 (2016-11-21 revision 57164) [x86_64-linux] 
[myname@ip-10-0-1-86 rails]$ gem update --system #gemをアップデート
[myname@ip-10-0-1-86 rails]$ rbenv exec gem install bundler #bundlerインストール 
[myname@ip-10-0-1-86 rails]$ rbenv rehash
[myname@ip-10-0-1-86 rails]$ rbenv exec bundle init #Gemfileが生成される
Writing new Gemfile to /var/www/rails/Gemfile
[myname@ip-10-0-1-86 rails]$ vi Gemfile

=ファイルの編集画面=

#gem "rails"
     ⬇︎
gem "rails", "4.2.7" ←　バージョンを追加

=================

[myname@ip-10-0-1-86 rails]$ rbenv exec bundle install --path vendor/bundle
[myname@ip-10-0-1-86 rails]$ rbenv exec bundle exec rails new qiita --skip-bundle -d mysql 
[myname@ip-10-0-1-86 rails]$ rm -f Gemfile; rm -f Gemfile.lock; rm -rf .bundle; rm -rf vendor #Rails をローカルインストールするために使用した Bundler 環境を削除
```
[rbenv rehashは何をやっているのか？](http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html)


###MySQLの設定

```
[myname@ip-10-0-1-86 qiita]$ cd qiita
[myname@ip-10-0-1-86 qiita]$ sudo yum install mysql-devel #MySQlインストール
[myname@ip-10-0-1-86 qiita]$ rbenv exec bundle install --path vendor/bundle
#bundle install する際に --path vendor/bundle をつけることで、gemのインストール先がRuby環境でなく、 ローカルのvendor/bundle ディレクトリ以下になる
[myname@ip-10-0-1-86 qiita]$ sudo vi .gitignore


=ファイルの編集画面=

/vendor/bundle ←　追加

=================


[myname@ip-10-0-1-86 qiita]$ vi config/database.yml


=ファイルの編集画面=

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: ********(←RDSインスタスのパスワード)
  host: db-id-for-qiita-nginx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com (←エンドポント)

~省略~

production:
  <<: *default
  database: db_qiita　(←DB名)
  username: db_qiita_user (←ユーザ名)
  password: <%= ENV['QIITA_DATABASE_PASSWORD'] %>

=================


[myname@ip-10-0-1-86 qiita]$ vi ~/.bash_profile


=ファイルの編集画面=

export RAILS_ENV="production"
export QIITA_DATABASE_PASSWORD="*********"(←RDSインスタスのパスワード)

=================


[myname@ip-10-0-1-86 qiita]$ source ~/.bash_profile
[myname@ip-10-0-1-86 qiita]$ sudo yum install nodejs --enablerepo=epel　#node.jsのインストール
[myname@ip-10-0-1-86 qiita]$ bundle exec rake db:migrate RAILS_ENV=production #dbの生成
```

###SecretKeyの登録・設定

```
[myname@ip-10-0-1-86 qiita]$ bundle exec rake secret
12345678910abcdefghijklmnopqrstuvwxyz
[myname@ip-10-0-1-86 qiita]$ vi ~/.bash_profile

=ファイルの編集画面=

export SECRET_KEY_BASE="12345678910abcdefghijklmnopqrstuvwxyz"

=================

[myname@ip-10-0-1-86 qiita]$ source ~/.bash_profile
```

###unicornのインストール・設定

```
[myname@ip-10-0-1-162 qiita]$ vi Gemfile

=ファイルの編集画面=

gem "unicorn"

=================

[myname@ip-10-0-1-86 qiita]$ rbenv exec bundle install --path vendor/bundle
[myname@ip-10-0-1-86 qiita]$ cd config
[myname@ip-10-0-1-86 config]$ touch unicorn.rb
[myname@ip-10-0-1-86 config]$ vi unicorn.rb
```

unicorn.rbの編集

```
=ファイルの編集画面=

# -*- coding: utf-8 -*-
worker_processes 4

listen File.expand_path('tmp/unicorn.sock')
pid File.expand_path('tmp/unicorn.pid')

stderr_path File.expand_path('log/unicorn.log')
stdout_path File.expand_path('log/unicorn.log')

preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

=================
```

###Nginxのインストール・設定

```
[myname@ip-10-0-1-86 config]$ sudo yum install nginx
[myname@ip-10-0-1-86 config]$ cd /etc/nginx/conf.d/
[myname@ip-10-0-1-86 conf.d]$ sudo touch local.conf
[myname@ip-10-0-1-86 conf.d]$ sudo vi local.conf
```

local.confの編集

```
=ファイルの編集画面=

upstream unicorn {
  server unix:/var/www/rails/qiita/tmp/unicorn.sock;
}

server {
  listen 80;
  server_name 54.238.XXX.XXX; (←EC2のパブリックIP)

  access_log /var/log/nginx/qiita_access.log;
  error_log /var/log/nginx/qiita_error.log;

  root /var/www/rails/qiita ;

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}

================
```

```
[myname@ip-10-0-1-86 conf.d]$ cd
[myname@ip-10-0-1-86 ~]$ cd /var/www/rails/qiita
[myname@ip-10-0-1-86 qiita]$ bundle exec unicorn_rails -c /var/www/rails/qiita/config/unicorn.rb -E production -D
[myname@ip-10-0-1-86 qiita]$ sudo service nginx start
Starting nginx:                                            [  OK  ]
```

![rails1.png](https://qiita-image-store.s3.amazonaws.com/0/114886/04c12f46-a285-10f3-2d5e-a36a9c2120c2.png)

nginxは起動しているも、"The page you were looking for doesn’t exist"のエラー表示
これはサーバー内にrailsに表示すべきファイルがないことが原因のよう
そのファイルを作成すれば解決される
[Unicornでrailsを動かす、vagrant環境](http://outof-rails.seesaa.net/comment?article_id=434501568)

###Hello, Worldの表示

```
[myname@ip-10-0-1-86 qiita]$ sudo service nginx stop #nginxを一旦停止
Stopping nginx:                                            [  OK  ]
[myname@ip-10-0-1-86 qiita]$ kill -QUIT `cat /var/www/rails/qiita/tmp/unicorn.pid`　#unicornを一旦停止
[myname@ip-10-0-1-86 qiita]$ bundle exec rails g controller test
[myname@ip-10-0-1-86 qiita]$ cd app/controllers
[myname@ip-10-0-1-86 controllers]$ vi test_controller.rb


=ファイルの編集画面=

def index
end

=================


[myname@ip-10-0-1-86 controllers]$ cd ..
[myname@ip-10-0-1-86 app]$ cd views/test
[myname@ip-10-0-1-86 test]$ touch index.html.erb
[myname@ip-10-0-1-86 test]$ vi index.html.erb


=ファイルの編集画面=

<div>
Hello, World!!
</div>

=================


[myname@ip-10-0-1-86 test]$ cd ../../..
[myname@ip-10-0-1-86 qiita]$ cd config
[myname@ip-10-0-1-86 config]$ vi routes.rb


=ファイルの編集画面=

root 'start#index'

=================


[myname@ip-10-0-1-86 config]$ cd ..
[myname@ip-10-0-1-86 qiita]$ bundle exec unicorn_rails -c /var/www/rails/qiita/config/unicorn.rb -E production -D
[myname@ip-10-0-1-86 qiita]$ sudo service nginx start
Starting nginx:                                            [  OK  ]
```
![rails4.png](https://qiita-image-store.s3.amazonaws.com/0/114886/f74f7505-6224-a81f-d019-33310073603e.png)
unicorn,nginxの停止

```
[myname@ip-10-0-1-86 qiita]$ sudo service nginx stop
Stopping nginx:                                            [  OK  ]
[myname@ip-10-0-1-86 qiita]$ kill -QUIT `cat /var/www/rails/qiita/tmp/unicorn.pid`

```
以上です。
Ruby2.4系だと
`warning: constant ::Fixnum is deprecated`
`warning: constant ::Bignum is deprecated`
といった警告ログが出ます。
消せるようですが...
[Rails 5.0.1 と Ruby 2.4.0 での警告ログを Forked Rails で消した](http://koic.hatenablog.com/entry/2017/01/31/182028)

大変参考にさせていただきました。
[Rails 5 + Unicorn + Nginx 環境構築メモ](http://qiita.com/yoshi111kazu/items/e8b29aa2b103f6e4ec03)