EC2でRuby on Railsアプリケーションの環境を構築する
EC2にRuby on Railsのアプリケーションの環境を構築します。
WEBサーバはnginx、アプリケーションサーバはpumaを使います。
事前準備
Railsのアプリケーションのコードは事前に作成しておきました。
https://github.com/kanoemon/sandbox-rails
nginxとpumaの連携でconfigを変更していますが、それ以外はデフォルトの設定のままの状態です。
インフラ構築
事前にEC2(Amazon Linux 2)は作成済みです。
- デフォルトのVPC、サブネットを使用
- インスタンスにパブリックIPを割り当て済み
- セキュリティグループは独自のセキュリティグループを適用
- ポート80を許可済み
Rubyのインストール
Rubyのインストールにはrbenvを使います。
https://github.com/rbenv/rbenv
インストールのために必要なソフトウェアをEC2にインストールしておきます。
$ sudo yum install git gcc openssl openssl-devel
rbenvのインストールとセットアップは以下コマンドを順に実行します。
# rbenvをcloneする
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# 環境パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# 初期化
$ ~/.rbenv/bin/rbenv init
# .bash_profileにeval "$(rbenv init - bash)"を追記する
$ vi ~/.bash_profile
# 変更した.bash_profileを読み込む
$ source ~/.bash_profile
次にruby-buildをインストールします。
ruby-buildとはRubyをコンパイルしてインストールするためのrbenvのプラグインです。
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
rbenvとruby-buildのセットアップが終わったらrbenv-doctorでチェックをします。
全てOKと表示されたらセットアップは無事完了です。
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /home/ec2-user/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/ec2-user/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20210804-1-g57c397d)
Counting installed Ruby versions: none
There aren't any Ruby versions installed under `/home/ec2-user/.rbenv/versions'.
You can install Ruby versions like so: rbenv install 3.0.2
Checking RubyGems settings: OK
Auditing installed plugins: OK
ここまででRubyをインストールするための準備が完了しました。
あとはrbenvでRubyをインストールします。
# インストールできるRubyのバージョンを確認
# rbenv install --list-allだとインストールできる全てのバージョンが確認できます
$ rbenv install -l
# 指定したバージョンをインストール
$ rbenv install 2.7.1
# Rubyのバージョンの切り替え
$ rbenv global 2.7.1
# 確認
$ ruby --version
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
nginxのインストール
Amazon Linux2ではyumでnginxがインストールできないので、amazon-linux-extrasでインストールします。
sudo amazon-linux-extras install nginx1
アプリケーションのセットアップ
今回はEC2でリポジトリを直接cloneしてアプリケーションを構築していきます。
まずRailsを動かすために必要なSQLite3とNode.jsをインストールします。
# SQLite3のインストール
$ sudo yum install sqlite-devel
# Node.jsのインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
$ node -e "console.log('Running Node.js ' + process.version)"
Running Node.js v16.8.0
pumaとnginxの連携
pumaとnginxの連携はunixドメインソケットを使います。
まずアプリケーションコードのpumaの設定ファイルを変更します。
デフォルトだとポート番号でlistenする設定になっているので、その設定をコメントアウトしてpumaで作成されるソケットファイルのパスを設定します。
config/puma.rb
# port ENV.fetch("PORT") { 3000 }
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"
nginxのconfファイルを作成し、config/puma.rbで指定したソケットファイルのパスを指定します。
$ sudo vim /etc/nginx/conf.d/sandbox-rails.conf
sandbox-rails.conf
upstream sandbox-rails {
# UNIXドメインソケットの設定
# 今回は/var/www配下にアプリケーションコードを設置します
server unix:///var/www/sandbox-rails/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /var/www/sandbox-rails/public;
location / {
try_files $uri @sandbox-rails;
}
location @sandbox-rails {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://sandbox-rails;
}
}
confファイルを作成し終わったら文法エラーがないかチェックします。
$ nginx -t
問題なければnginxを起動します。
$ sudo service nginx start
アプリケーションコードの設置
リポジトリをcloneしてアプリケーションコードを設置し、bundle installでライブラリをインストールします。
$ sudo mkdir -p /var/www
$ sudo chmod 777 /var/www
$ cd /var/www
$ git clone https://github.com/kanoemon/sandbox-rails.git
$ cd sandbox-rails
$ bundle install
起動
以下コマンドで起動。
$ bin/rails s
ブラウザからアクセスし、以下画面が表示されれば無事起動完了です。