AWSでRuby on Railsを動かす
実行環境
- 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にアクセスする設定になっているので、ブラウザでアクセスし、下記の画面が表示されれば成功