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 環境の作成が完了しました!
お疲れさまでした。
おわりに
ここまでご覧いただきありがとうございました。
わかりにくい所などありましたら、どんどんコメントください!
コメント