AWSにアプリをデプロイする
はじめに
AWSでサーバーを構築してアプリを動かすまでをまとめてみます。
AWSのEC2の作成などはご自身でお願いします。
また、この記事は初心者が備忘録として書いた記事なので参考にする際はお気をつけください。
Ruby : 2.7.3
Rails : 6.1.4
DB : MySQL
WEBサーバー : nginx
Applicationサーバー : puma
EC2インスタンスの作成は省略
この記事ではEC2インスタンス作成後の内容となっています。
EC2はAmazon Linux 2 AMI (HVM) イメージを使用。
EC2インスタンスの作成は他の記事を参照するようお願いします。
サーバーに環境を用意
パッケージのインストール
使用していくパッケージのインストールを行います。
$ sudo yum -y install git gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel libcurl-devel mysql mysql-devel
Nodeのインストール
$ curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - $ sudo yum -y install nodejs
yarnのインストール
$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo $ sudo yum -y install yarn
MySQLのインストール
今回RDSを使わずにMySQLをインストールして使用していきます。
データベースはprivateなネットワークに作成してください。
#mariaDBの削除 $ sudo yum remove mariadb-libs
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
MySQL Serverのインストール
$ sudo yum install mysql-server $ mysqld --version
MySQL Serverの起動
# サーバーの起動 $ sudo systemctl start mysqld.service # サーバーの状態の確認 $ sudo systemctl status mysqld.service
サーバーを起動しようとしたらエラーが出た...以下の記事を参考に解決
Centos7でMysqlの起動にハマった話 | Tips of Rubbish
MySQLにログイン
#rootパスワードを確認 $ sudo cat /var/log/mysqld.log | grep password #mysqlにログイン 確認したパスワードを入力 exitで終了 $ mysql -u root -p #初期設定 $ sudo mysql_secure_installation #新しいパスワードでmysqlにログインできるか確認 $ mysql -u root -p
データベースとユーザーの作成
#ログイン後 #ユーザーの作成 mysql > create user 'ユーザー名(test_user)'@'ホスト名(localhost)' identified by 'パスワード(メモしておく)'; #データベースの作成 mysql > create database データベース名(test_app); #権限の付与 mysql > grant all on *.* to 'ユーザー名(test_user)'@'ホスト名(localhost)'; #権限の変更をデータベースに反映 mysql > flush privileges; mysql > exit;
※Railsアプリのdatabase.ymlのproductionグループのデータベース名とユーザー名を対応しておく
nginxのインストール
ngiinxのインストール
$ sudo amazon-linux-extras install -y nginx1
nginxの起動
$ sudo systemctl start nginx
状態確認
$ systemctl status nginx
nginxの設定ファイル
nginxの設定ファイルは /etc/nginx に置いてある
nginxの設定ファルは以下の順で読み込まれる
/etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf
nginxの設定
nginxのインストールが終わったら
nginxとRuby on Railsが連携できるように/etc/nginc/conf.dフォルダ配下に設定ファイルを作成していきます。
今回はrails.confというファイルを作成してその中に設定を記述します。
vimで作業する場合は sudo vim /etc/nginx/conf.d/rails.conf
#リバースプロキシとして扱うための設定 #ここでバックエンドのサーバーを指定する upstream puma{ #tmp/sockets/puma.sockでpumaのsocketファイルを指定 server unix:///var/www/アプリ名/tmp/sockets/puma.sock; } server { #接続を待ち受けたいポートを指定 listen 80; listen [::]:80; server_name puma; #assetsファイルにアクセスされたときの設定 location ~^ /assets/ { root /var/www/Test/public; } location / { proxy_read_timeout 300; proxy_connect_timeout 300; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $http_x_forwarded_protp; proxy_set_header X-Forwarded=for $proxy_add_x_forwarded_for; proxy_pass http://puma; } }
ユーザーの作成、アプリを動作させるディレクトリを作成
$ sudo adduser deploy $ sudo mkdir -p /var/www $ sudo chown deploy:deploy /var/www
Railsの環境構築
ここからのデプロイ作業はデプロイユーザーに切り替えて行います。
ルートユーザーからユーザーを切り替えるのは権限の関係で
Rbenvのインストール
# インストール $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv # パスを通す $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile #プラグインのインストール $ mkdir -p "$(rbenv root)"/plugins $ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build #.bash_profileの反映 $ source ~/.bash_profile # セットアップ $ ~/.rbenv/bin/rbenv init $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
Rubyのインストール
$ rbenv install 2.7.3 $ rbenv global 2.7.3
Railsのインストール
$ gem install rails -v 6.1.4
アプリのダウンロード
GitHubからクローン
$ cd /var/www $ git clone ご自身のアプリ
※database.ymlのproductionのdatabaseとusernameはMySQLで設定したものを指定
ライブラリを導入
$ cd アプリ名 $ bundle install
MySQLインストール時にエラーが出た
Ruby - bundle install 時に出るエラー Gem::Ext::BuildError: ERROR: Failed to build gem native extension.|teratail
上記記事を参考に解決
シークレットキーの作成
# メモしておく $ rails secret
アプリの設定
.bash_profileに環境変数を設定していきます。
ここではRailsのシークレットキー、MySQLのパスワードなどを適宜設定します。
$ vim ~/.bash_profile export SECRET_KEY_BASE=rails secretで作成したシークレットキー export TEST_DATABASE_PASSWORD=MySQLのユーザー登録で設定したパスワード #.bash_profileの反映 $ source ~/.bash_profile
テーブルの作成
$ rails db:migrate RAILS_ENV=production
MySQLサーバーに接続できないとエラーが出た
以下の記事を参考に解決
Rails アプリ起動時のMysqlエラー を解消 (Mysql2::Error::ConnectionError ・ Can't connect to local MySQL server through socket '/tmp/mysql.sock') - Qiita
アプリの起動
ルートユーザーで作業
nginxの再起動
$ sudo systemctl restart nginx.service
アプリを起動
deployユーザー
$ cd /var/www/アプリ名 $ rails assets:precompile RAILS_ENV=production $ rails server -e production
参考にした書籍
おわりに
RailsとNginxの連携にかなり手こずってしまいました、、
Nginxの設定など詳しく分からないところが多いので今後触る機会に理解していければと思います。
次回はもっとスムーズにアプリをデプロイできるようになりたいです。