AmazonLinuxにNginxとRailsをインストールして80番ポートからrailsに繋げる

AmazonLinuxが入ったEC2インスタンスを立ち上げてNginxとRuby on Railsをインストール&設定したので、その時の手順書です。

初期ログインユーザは `ec2-user` で行っており、サーバのポートは80番と3000番（これは一時的な動作確認のため）を開けている前提です。

## Nginxのインストールと自動起動設定

yumでnginxをインストールして立ち上げ、あとサーバが再起動した際に自動起動するように設定しておきます。

```
// インストール
$ sudo yum install -y nginx

//  自動起動設定
$ sudo chkconfig nginx on

// 起動
$ sudo service nginx status
nginx is stopped
$ sudo service nginx start
Starting nginx:                                            [  OK  ]
$ sudo service nginx status
nginx (pid  12200) is running...
```

ブラウザで **http:// Public IPアドレス** にアクセスしてnginxの初期画面が表示されればOK。

## Ruby on Railsアプリケーションの構築

AmazonLinux ver2017.03に入っているrubyのバージョンは2.0.0であり、記事投稿時の最新版である2.4.1と比べて古い、しかしシステムのRubyに変更を加えたくないので、rbenvをインストールして2.4.1を使おうと思います。

### rbenvとruby2.4.1のインストール

`ec2-user`でsudoを使って作業しているとrbenvの初回起動時やrubyインストール時などにパーミッション関係のエラーが出るのが面倒なので、ここではrootユーザで作業します。


```
// rootユーザになる
$ sudo su -
#

// rubyのインストール必要な所々のソフトウェアをインストール
# yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel git

// rbenvをgit clone
# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build

// /etc/profile.d/rbenv.shに以下の内容を記述
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

// ファイルの読み込み
# source /etc/profile.d/rbenv.sh

// rbenvのインストール確認とruby2.4.1のインストール
# rbenv --version
rbenv 1.1.1-2-g615f844
# rbenv install --list
（中略）
# rbenv install 2.4.1
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
Installed ruby-2.4.1 to /usr/local/rbenv/versions/2.4.1
# rbenv versions
* system (set by /usr/local/rbenv/version)
  2.4.1
# rbenv global 2.4.1
```

## railsのインストール

ruby2.4.1のインストールができたので、railsをインストールします。

```
// そのままrootユーザでやってます
# gem update --system
# gem install --no-ri --no-rdoc rails
# rbenv rehash
```

## webappユーザの作成

railsアプリケーションを作成する前に、nginxとrailsアプリケーションを動かすユーザを作成しておきます。

```
// ここもrootユーザでやってます
# cp -p /etc/passwd /etc/passwd.ORG
# cp -p /etc/shadow /etc/shadow.ORG
# cp -p /etc/group  /etc/group.ORG
# groupadd webapp
# useradd webapp -g webapp -d /home/webapp -s /bin/bash
# id webapp
uid=501(webapp) gid=501(webapp) groups=501(webapp)
```

## webappユーザでrailsアプリケーションの作成

railsアプリケーションを作成します。

```
// webappユーザになる
$ sudo su - webapp

// アプリケーションの作成
$ rails new railsapp --skip-bundle
$ cd railsapp/

// このままだとjsの実行環境が無いと怒られたのでGemfileに `gem 'therubyracer'` を追記
$ echo 'gem 'therubyracer'' >> Gemfile

$ bundle config build.nokogiri --use-system-libraries
$ bundle install --path=vendor/bundle
$ bundle exec rails s -b 0.0.0.0
```

ブラウザで **http:// Public IPアドレス:3000** にアクセスしてrailsの初期画面が表示されたらOK。


## nginxからpumaに接続するように設定

### pumaの設定と起動

nginxからunix socketを使って接続するためにpumaの設定ファイルに設定を記載します。

```
echo 'bind "unix://#{app_root}/tmp/sockets/puma.sock"' >> config/puma.rb
```


pumaをデーモンとして実行。

```
$ bundle exec puma -d -C config/puma.rb
```

### nginxの設定と再起動

ここは`sudo`を使うためにec2-userでやってます。

nginxの実行ユーザをrailsアプリケーションの実行ユーザと同じwebappに変更。

```
$ sudo vim /etc/nginx/nginx.conf
- user nginx;
+ user webapp;
```

`/etc/nginx/conf.d/webapp.conf`に設定を記載。

```
upstream railsapp {
    # Path to Puma SOCK file, as defined previously
    server unix:///path/to/railsapp/tmp/sockets/puma.sock fail_timeout=0;
}

server {
    listen 80;
    server_name サーバ名;

    root /path/to/railsapp/public;

    try_files $uri/index.html $uri @railsapp;

    location / {
        proxy_pass http://railsapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}
```

`/var/lib/nginx` にファイルが有るとwebappユーザでnginxを起動した時にキャッシュ関係のエラーが出ることがあったので、ディレクトリのownerをwebappユーザに変更しておきます。

```
$ sudo chown -R webapp /var/lib/nginx
```

nginxを再起動。

```
sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

ブラウザで **http:// Public IPアドレス** にアクセスしてrailsの初期画面が表示されたら完了。


## 参考

- [EC2（Amazon Linux）に Nginx をインストールしてBasic認証する ｜ Developers.IO](http://dev.classmethod.jp/etc/amazon_linux_nginx_basic_auth/)
- [Rails5.0.0 + puma3.6 + nginx1.10.1連携 - Qiita](http://qiita.com/kaikusakari/items/e7935439a2215fcf5773)
- [rails5+puma+nginxで本番環境を構築してみる – 不動産屋のエンジニアリング日記](http://www.gakusmemo.com/?p=608)
- [Vagrant & VirtualBox上のUbuntuでRuby + Rails5 + Puma + Nginx - Qiita](http://qiita.com/wordijp/items/32afa58238f5f83059a6)
- [Rails 5 + Unicorn + Nginx 環境構築メモ（自動起動設定も） - Qiita](http://qiita.com/yoshi111kazu/items/e8b29aa2b103f6e4ec03)
- [Amazon LinuxにRuby on Rails環境構築(rbenv + ruby-build + Ruby 2.2.1 + Rails 4.2.1インストール) - Qiita](http://qiita.com/na0AaooQ/items/5bd62e630a2faf051a52)
- [rails5 + puma + nginx で AWSテスト環境を構築してみる - ウォンツテック](http://sodex.hatenablog.com/entry/2017/02/05/141803)
- [ruby on rails - how to start puma with unix socket - Stack Overflow](https://stackoverflow.com/questions/17450672/how-to-start-puma-with-unix-socket)
- [CentOS6.4でRuby2.0+Rails4+pumaデーモン+Nginx - Qiita](http://qiita.com/haracane/items/a7821e5f8707db28595b)
- [ruby on rails - rails5, puma, nginxで繋げる事ができない。 - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/33788/rails5-puma-nginx%E3%81%A7%E7%B9%8B%E3%81%92%E3%82%8B%E4%BA%8B%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)
- [Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築 - Qiita](http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23)
- [CentOSでrbenv + Rails4 + puma + Nginxを使う - Qiita](http://qiita.com/takakiku/items/cb173520aba2099de19b)
- [Rails5 on Nginx on CentOS7 環境構築](https://blog.fileshelfplus.com/rails/247)