AWS を使用して Rails 6 + MySQL + Nginx という基本的なよくあるサーバーの構築方法をご紹介します。
1つの記事に書くには、長くなるので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インスタンスのセキュリティグループを編集します。
セキュリティーグループのインバウンドルールにルールを追加します。
- カスタム TCPを選択
- ポート範囲に3000を入力
- ソースに「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
userをec2-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 環境の作成が完了しました!
お疲れさまでした。
おわりに
ここまでご覧いただきありがとうございました。
わかりにくい所などありましたら、どんどんコメントください!


コメント