AWSでRuby on Railsを動かす

AWS ruby 環境構築

実行環境

  • AWS
  • AL2(amazon linux2)
  • nginx
  • unicorn
  • ruby on rails
  • mysql

nginxのインストールまで完了している環境とする。

下記コマンドでrubyに必要なソフトをインストールする。

sudo 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のインストール

rubyのバージョン管理するrbenvのインストールをする。
先ほどgitもインストールしているので、gitを使いrbenvをインストール

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 

パスを通す。

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

また、rbenvのプラグインのruby-buildもインストールする。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenvがインストールされたか確認

rbenv -v

rubyのインストール

上記でインストールしたrbenvを使ってインストール
まずはインストールできるバージョンをチェック

rbenv install -l

バージョンを指定してインストール

rbenv install 2.7.0

どのバージョンを使うか選択する

rbenv local [使うバージョン]
rbenv global [使うバージョン]

インストールしたRubyを使用可能な状態にする

rbenv rehash

rbenv versionでインストールされているrubyのバージョンを確認

rbenv versions

rubyがインストールされたか確認

ruby -v

Bundlerをインストール

まずgemの管理ソフトのbundlerをインストールする。
rubyのバージョンが2.3.0以上じゃないと動かないので注意

gem install bundler 

bundleのインストール状況を確認する。

bundle -v

bundleインストールを使って必要なソフトをインストールします。
プロジェクト毎にインストールするので今回は
/var/www/rails_app/を作って移動してからコマンドを実行

bundle init

上記で作成されたGemfileを編集

vi Gemfile

bundleでとりあえずrailsをインストールするので、Gemfileに下記を追加

gem "rails"

下記コマンドでインストールを実行

bundle install

これでrailsのインストール完了した

rubyプロジェクトを作成してみる

下記コマンドでrubyのプロジェクトを作成する。

bundle exec rails new プロジェクト名

mysqlを使ってrailsを動かしたい場合は下記になる。

bundle rails new プロジェクト名 -d mysql

今回はoffice_systemと言うプロジェクトをmysql作成したいので

bundle exec rails new office_system -d mysql

を実行し作成

下記コマンドで作成されているファイルを確認

cd /var/www/rails_app/office_system/
ls -la

railsがインストールされている環境にunicornもインストールしたいので
Gemfileを編集し下記を追加

gem 'unicorn'

編集し終わったら再度

bundle install

を実行しunicornをインストールをする。

エラーが発生するので下記をインストール

sudo yum install mysql-devel

下記もインストールを実行する。

gem install sassc -v '2.3.0' --source 'https://rubygems.org/'`

再度bundle installを実行する。

unicornの設定

インストールの確認も含めてunicornのバージョンを確認

bundle exec unicorn -v

unicornはインストールフォルダ等がある訳ではではく、実行環境や設定ファイルを自分で作成する。

今回は下記の構成で作成(フォルダ等を作成していないと実行時にエラーが発生する。)

/var/www/rails_app/プロジェクト名/
├── config.ru
├── my_app.rb
├── log
├── tmp
│   ├── pids
│   └── sockets
└── config
    └──unicorn.rb

上記構成にする為に下記コマンドでフォルダを作成

mkdir tmp
mkdir log

今回はoffice_systemと言うアプリで製作しているので下記コマンドでunirocn.rbを作成する。

vi /var/www/rails_app/office_system/config/unicorn.rb

下記のようにファイルを設定
rails_rootはunicorn.rbの配置によってかわるので、今回の配置では相対パスでは下記の設定になる。

rails_root = File.expand_path('../../', __FILE__)
rails_env = ENV['RAILS_ENV'] || "development"

worker_processes 2
working_directory rails_root

listen 8080

# listen "#{rails_root}/tmp/#{rails_env}_unicorn.sock"
pid "#{rails_root}/tmp/#{rails_env}_unicorn.pid"

stderr_path "#{rails_root}/log/#{rails_env}_unicorn_error.log"
stdout_path "#{rails_root}/log/#{rails_env}_unicorn.log"

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
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, 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

config.rbは、rails newした時に作成されるので作成しなくてもよい。
config.rbも作成する(作成しないとunicorn実行時にエラーがでる。)

require_relative 'config/environment'
run Rails.application

unicornの実行
実行する前にunicornを実行するフォルダに移動する。

cd /var/www/rails_app/office_system/
bundle exec unicorn -c config/unicorn.rb  -D

または下記コマンドで実行する。

bundle exec unicorn -c /var/www/rails_app/office_system/config/unicorn.rb  -D

実行するとdatabaseの設定がされていない為エラーになる。
実行されている場合は、プロセスが走っているか確認する。

ps -x

プロセスを確認できたら
unicornサーバーへのアクセスをtelnetでlocalhost通信し確認する。

sudo yum install telnet
telnet localhost 8080
GET /index.htm

unicorn の停止方法

kill -QUIT `cat /var/www/rails_app/tmp/development_unicorn.pid`

このまま実行するとrailsに対してsqllite3のバージョンが古いので新しいバージョンのsqllite3をインストールして下さいと言うエラーが出るので
今回はsqllite3は使わずmysqlを使うのでmysqlをインストールし、ActiveRecord使用するSQLを変更する。

vi /var/www/rails_app/office_system/Gemfile
# gem 'sqlite3' <- 必要ないのでコメントアウト
gem 'mysql2'

保存して下記コマンドを実行

bundle install

Mysqlのインストール

次にDBのmysql8をインストールする。

sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
sudo yum -y install mysql-community-server

インストール状況の確認もかねて下記でバージョンの確認をする。

mysql --version

Mysqlの設定

mysqlを起動する。

sudo systemctl start mysqld.service

rootのパスワードの確認

sudo cat /var/log/mysqld.log | grep password

初期設定

mysql_secure_installation

ログイン

mysql -u root -p

ログイン後データベースを作成する

CREATE DATABASE db_name;

AcriveRecordのDB設定

Active recordの使用するデータベースを変更する。
database.ymlを編集する。

vi /var/www/rails_app/office_system/config/database.yml
development:
  adapter: mysql2
  encoding: utf8
  database: office_system
  pool: 5
  username: root
  password: 設定したパスワードを入力
  socket: /tmp/mysql.sock

こちらで設定完了、再度下記コマンドを実行

cd /var/www/rails_app/office_system/
bundle exec unicorn -c config/unicorn.rb  -D

今回はipアドレスに8080にアクセスする設定になっているので、ブラウザでアクセスし、下記の画面が表示されれば成功