Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

EC2にRailsアプリケーションをデプロイしてみた

目次

概要

webサーバーはNginxを、アプリケーションサーバーはUnicornでEC2 にRailsアプリケーションをデプロイしてみました。

大まかな作業手順

  1. VPC、パブリックサブネット、EC2インスタンスを作成して、ElasticIPをEC2インスタンスに付与します。
  2. EC2インスタンスSSH接続して、必要なパッケージ(Node.js、Ruby、rbenv、その他色々)をインストールします。
  3. MariaDB(MySqlの派生)をインストールして、設定します。
  4. EC2インスタンスGitHubSSH接続できるように設定します。
  5. /var/www/ディレクトリを作成して、この配下にGittHubでcloneしてきたRailsアプリケーションを配置する予定です(まだ配置しない)。
  6. Nginxをインストールして、Nginxの設定をします。
  7. Unicornをインストールして、Unicornの設定をします。
  8. /var/www/配下にRailsアプリケーションをクローンしてくる。クローン後にbundleを実行してgemをインストールします(.gitignoreにgemはリモートにプッシュしないと書いたので、リモートリポジトリにはgemのファイルがない状態です。そのため、サーバー上でgemインストールコマンドを実行します。)。
  9. ローカルではアセットファイルが自動でコンパイルされていたが、本番だとアセットファイルがコンパイルされないので、コマンドを実行して手動コンパイルします。
  10. RailsのコマンドでDBを作成します。
  11. NginxとUnicornを起動させて、本番でアクセスできればOKです。

以下の記事を参考に作業しました。このブログでは手順をざっくりまとめただけなので、詳細はこちらのブログが参考になります。
【Rails】 AWSのEC2にデプロイする方法~画像で丁寧に解説! | Pikawaka

初めて知ったこと

  • 一般的に/var/www/には、Webサーバーから参照されるファイル群を置きます。
  • プロキシサーバーとは、ブラウザの代わりにWebサーバーにアクセスしてくれるコンピュータのことです。ブラウザとWebサーバーの間にプロキシサーバーを挟むことで、アクセス元を隠せたり、キャッシュができたりします。
  • リバースプロキシサーバーとは、Webサーバーの代わりにリクエストを返すサーバーのことです。
  • UNIXドメインソケットとは、同じコンピュータ上で同時に実行されている異なるプログラム(プロセス)間でデータを送受信するプロセス間通信の一つです。ネットワーク通信で用いられるソケット(socket)の仕組みを流用しています。UnicornとNginxが同一マシン上にある場合、この方法で接続させます。ざっくりとしか分かっていませんがNginxの設定ファイルで、リクエストしたURLの静的ファイルがあればNginxがそれを返し、なければUnicornに処理を渡して動的に生成したファイルをUnicornから受け取りNginxが返すようなコードを書いています。
  • RailsアプリケーションをデプロイしたときにThe page you were looking for doesn't exist. というエラー画面が表示された場合、ルートのルーティングを設定して、エラーページをカスタマイズすればOKです。
  • __FILE__は、現在実行しているファイルを返します。
  • sudo nginx -tでnginxの設定ファイルのシンタックスエラーをチェックできます。
  • SSHで接続を切っても、サーバーで動いているプロセスは終了しないです。

まだよく分かっていないこと

感想

現状1つのEC2インスタンスにNginx、UnicornMariaDBをインストールしているので、1つのEC2インスタンスがWebサーバー、アプリケーションサーバー、DBサーバーの役割を担っています。EC2インスタンスはインターネットに接続するために、パブリックサブネットに配置されています。DBサーバーはプライベートサブネットに配置するのがセキュリティ的に安心なので、実際に仕事でシステムを構築するときはDBサーバーは分離させた方が良いなと感じました(RDSを設置する or 別のEC2インスタンスを設置して、そこにDBMSをインストールする)。

あと、リモートリポジトリのコードに変更があった場合、EC2インスタンスSSH接続して、該当ディレクトリまで移動してgit pullする必要があるので、結構めんどくさいです。それをCapistranoで自動デプロイできるのはすごく良いなと感じました。

参考記事

【Rails】 AWSのEC2にデプロイする方法~画像で丁寧に解説! | Pikawaka

"var/www/"とはなんでしょうか?

プロキシ

リバースプロキシ

UNIXドメインソケットとは - 意味をわかりやすく - IT用語辞典 e-Words

UnicornとNginxの接続方法は、UNIXドメインソケットとリバースプロキシの2つの方法がある - kasei_sanのブログ

nginx の try_files でよくやる設定の意味

Herokuへデプロイした時に「The page you were looking for doesn't exist. 」エラーが出る - Qiita

Rails 'error Command "webpack" not found.'について - Qiita

[Ruby] __FILE__や__dir__って何? - Just do IT

File.expand_path (Ruby 3.1 リファレンスマニュアル)

【Rails】 envメソッドで環境を確認する方法と各コマンドの指定方法 | Pikawaka

systemctl restart nginx でのエラー(centos7)

NGINX エラーログをみて解決する - Qiita

NGINX エラーログをみて解決する - Qiita

S3/Cloudfront vs EC2/load balancer for static (React.js) app : aws

master.keyが見つからない問題 [初見殺し] - はじめてのデプロイで嵌るポイント(Rails 5.2以降) - Qiita

既存のRailsアプリのRubyバージョンアップしてみた - Qiita

ダウンロード

GitHub - yarnpkg/yarn: The 1.x line is frozen - features and bugfixes now happen on https://github.com/yarnpkg/berry

EC2とRDSを利用してRails 6 + MySQL 5のアプリケーションをAWS上で起動する | Enjoy IT Life