AWS Rails 6 + MySQL + Nginx な環境の作成方法 サーバー編

AWS を使用して Rails 6 + MySQL + Nginx という基本的なよくあるサーバーの構築方法をご紹介します。

1つの記事に書くには、長くなるので3部作でお送りいたします。

  1. ネットーワーク環境編
  2. データベース編
  3. サーバー編 ← 今回はここ

ここでは、ネットーワーク環境編で作成したEC2インスタンスに Rails 6 + Nginx が動くように実行環境を構築します。

Step1. Ruby on Railsのインストール

Rails 6 を実行するためのRuby実行環境を構築していきます。

sshでEC2にログイン後、パッケージをアップデートします。

$ sudo yum update -y

次に、rails立ち上げに必要なパッケージをインストールします。

$ sudo yum install -y gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel

rbenvのインストール

rebenvは、簡単にrubyのバージョンを切れ変えれるツールです。

$ sudo yum install -y git
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

上記でだけでは、コマンド実行できないのでPATHを通します。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

ruby-buildのインストール

ruby-buildはrubyをインストールするためのrbenvプラグインです。

$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh

rbenvからインストールしないとエラーが出ますので注意です。

rbenvの確認

$ rbenv -v
rbenv 1.1.2-40-g62d7798

rubyをインストール

rbenvでバージョン2.7.2をインストールします。

$ rbenv install -v 2.7.2
$ rbenv rehash
$ rbenv global 2.7.2
$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]

bundlerのインストール

bundlerは、gemの依存関係とバージョンを管理するためのgemです。

gem同士の関係で問題が発生しないようにgemをインストールしたり、プロジェクトごとに分けることが可能にできます。

$ gem install bundle
$ bundler -v
Bundler version 2.1.4

railsのインストール

<span class="nv">$ </span>gem <span class="nb">install </span>rails <span class="nt">-v</span> 6.1.0
$ rails -v
Rails 6.1.0

nvmのインストール

Node.jsが必要なのでnvmをインストールします。

nvmとは、rbenvのようなnodeのバージョンを切り替えれるツールです。

<span class="nv">$ </span>git clone https://github.com/creationix/nvm.git ~/.nvm
<span class="nv">$ </span><span class="nb">source</span> ~/.nvm/nvm.sh

次回から起動時に読み込まれるように .bash_profile を編集します。

$ vi .bash_profile

以下を記述

if [ -f ~/.nvm/nvm.sh ]; then
      . ~/.nvm/nvm.sh
fi

Node.jsのインストール

nvmでNodeバージョン14.15.3をインストールします。

$ nvm install 14.15.3
$ node -v
v14.15.3

$ npm -v
6.14.9

yarnのインストール

Rails 6からwebpckerというものが必要になり、yarnのインストールが必要になりました。

webpackerとは簡単に言うと、webpackを使用してRails上でJavascript開発するために必要な一連のまとまりを、標準で実装できるgemパッケージです。

webpackとは、Webアプリケーションを構成するリソース(jsファイル、cssファイル、画像ファイル)を一つにまとめてくれるルーツです。

$ npm install yarn -g
$ yarn -v
1.22.10

Railsの雛形アプリケーション「sample」の作成

$ sudo yum -y install mysql-devel
$ rails new sample -d mysql --skip-turbolinks

-d mysql をオプションをつけることでMySQLをデータベースとして使用すると最初から設定してくれます。

sampleアプリケーションのgemをインストール

sampleフォルダに移行後、bundleコマンドsampleアプリケーションに使用するgemをインストールします。

$ cd sample
$ bundle install --path vender/bundle

pathを指定することでsampleアプリケーションのgemをvender/bundleにインストールします。

これで、Ruby on Railsの環境構築は完了です。

Step2. Railsサーバーの起動

環境構築が完了したところで、Railsサーバーの起動をしてみましょう。

$ rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.1.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.1.1 (ruby 2.7.2-p137) ("At Your Service")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 32325
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop

オプション-b 0.0.0.0を指定しないとインターネットからの接続ができなくなります。

起動が確認できれば完了です。

3000番ポートからインターネット接続

Rails サーバーを起動して3000番ポートから接続確認してみましょう。

まずは、EC2インスタンスのセキュリティグループを編集します。

セキュリティーグループのインバウンドルールにルールを追加します。

  1. カスタム TCPを選択
  2. ポート範囲に3000を入力
  3. ソースに「0.0.0.0/0と::/0」を選択

セキュリティーグループを編集できたら、EC2インスタンスの「パブリックIPアドレス:3000」で接続してみましょう。

接続してみると、MySQLが出ているかと思いますがデータベースの作成をしていませんのでOKです。

※パブリックIPアドレスは、EC2インスタンスの概要から確認できます。

 

データベースの作成

config/database.ymlをデータベース編で作成した認証情報とホストにエンドポイントを指定して、データベース設定をします。

...
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: "認証情報のユーザ名"
  password: "認証情報のパスワード"
  host: "RDSのエンドポイント"
...
$ rails db:create

作成後、もう一度接続。

Railsの画面が表示されていればRuby on Railsのインストールは完了です。

Step3. Nginxのインストール

Webサーバーになる、Nginx のインストールしていきます。

$ sudo amazon-linux-extras install -y nginx1
$ sudo systemctl start nginx.service
$ sudo systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since 日 2021-01-10 09:10:35 UTC; 1min 23s ago
...

active(running)と表示されていればNginxのインストールは完了です。

Step4. Nginxの起動確認

3000番ポート指定せずに、パブリックIPアドレスに接続してみましょう。

Nginxが表示されていれば完了です。

Step5. NginxからRailsに接続する

Nginxから接続するにはアプリケーションサーバーが必要になりますので、unicornというものを使用します。

unicornのインストール

Gemfileに下記の行を追加し、bundleインストールします。

gem 'unicorn'
$ bundle install

bundleインストール完了したら、unicornの設定ファイルを作成します。

$ vi config/unicorn.rb

下記を記入

$worker = 2
$timeout = 30
$app_root = File.expand_path('../../', __FILE__)
$listen = File.expand_path 'tmp/sockets/unicorn.sock', $app_root
$pid = File.expand_path 'tmp/pids/unicorn.pid', $app_root
$std_log = File.expand_path 'log/unicorn.log', $app_root

worker_processes $worker
working_directory $app_root
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen $listen
pid $pid

preload_app true

before_fork do |server, worker|
 defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
 old_pid = "#{server.config[:pid]}.oldbin"
 if old_pid != server.pid
  begin
   Process.kill "QUIT", File.read(old_pid).to_i
  rescue Errno::ENOENT, Errno::ESRCH
  end
 end
end

after_fork do |server, worker|
 defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

Nginxの設定

今回作成したアプリケーション用のNginx設定ファイルを作成します。

$ cd /etc/nginx/conf.d
$ sudo vi sample.conf

以下を記述。

 

upstream unicorn {
    #railsアプリケーションのunicorn.sockを指定する
    server unix:/home/ec2-user/sample/tmp/sockets/unicorn.sock;
}

server {
    listen       80;
    server_name  localhost;

    access_log  /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    root /home/ec2-user/sample/public; #Railsプロジェクを指定

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

    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

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

デフォルトのnginx.confを編集します。

$ sudo vi /etc/nginx/nginx.conf

userec2-userに、serverディレクティブ全体をコメントアウトまたは消去します。

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user ec2-user; #ec2-userに書換
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

# server{} 消去

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

編集完了したらNginxの再起動をします。

$ sudo systemctl restart nginx.service

再起動できたら、もう一度3000番ポート指定せずに、パブリックIPアドレスに接続してみましょう。

これで、Rails 6 + MySQL + Nginx 環境の作成が完了しました!

お疲れさまでした。

おわりに

ここまでご覧いただきありがとうございました。

わかりにくい所などありましたら、どんどんコメントください!

コメント

タイトルとURLをコピーしました