目次
概要
webサーバーはNginxを、アプリケーションサーバーはUnicornでEC2 にRailsアプリケーションをデプロイしてみました。
大まかな作業手順
- VPC、パブリックサブネット、EC2インスタンスを作成して、ElasticIPをEC2インスタンスに付与します。
- EC2インスタンスにSSH接続して、必要なパッケージ(Node.js、Ruby、rbenv、その他色々)をインストールします。
- MariaDB(MySqlの派生)をインストールして、設定します。
- EC2インスタンスとGitHubがSSH接続できるように設定します。
- /var/www/ディレクトリを作成して、この配下にGittHubでcloneしてきたRailsアプリケーションを配置する予定です(まだ配置しない)。
- Nginxをインストールして、Nginxの設定をします。
- Unicornをインストールして、Unicornの設定をします。
- /var/www/配下にRailsアプリケーションをクローンしてくる。クローン後にbundleを実行してgemをインストールします(.gitignoreにgemはリモートにプッシュしないと書いたので、リモートリポジトリにはgemのファイルがない状態です。そのため、サーバー上でgemインストールコマンドを実行します。)。
- ローカルではアセットファイルが自動でコンパイルされていたが、本番だとアセットファイルがコンパイルされないので、コマンドを実行して手動コンパイルします。
- RailsのコマンドでDBを作成します。
- 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で接続を切っても、サーバーで動いているプロセスは終了しないです。
まだよく分かっていないこと
- RDSとアプリケーションサーバーの接続方法
- DBサーバーとアプリケーションサーバーに該当するサーバーを分離させたときの接続方法
- Capistranoを使った自動デプロイ
感想
現状1つのEC2インスタンスにNginx、Unicorn、MariaDBをインストールしているので、1つのEC2インスタンスがWebサーバー、アプリケーションサーバー、DBサーバーの役割を担っています。EC2インスタンスはインターネットに接続するために、パブリックサブネットに配置されています。DBサーバーはプライベートサブネットに配置するのがセキュリティ的に安心なので、実際に仕事でシステムを構築するときはDBサーバーは分離させた方が良いなと感じました(RDSを設置する or 別のEC2インスタンスを設置して、そこにDBMSをインストールする)。
あと、リモートリポジトリのコードに変更があった場合、EC2インスタンスにSSH接続して、該当ディレクトリまで移動してgit pullする必要があるので、結構めんどくさいです。それをCapistranoで自動デプロイできるのはすごく良いなと感じました。
参考記事
【Rails】 AWSのEC2にデプロイする方法~画像で丁寧に解説! | Pikawaka
UNIXドメインソケットとは - 意味をわかりやすく - IT用語辞典 e-Words
UnicornとNginxの接続方法は、UNIXドメインソケットとリバースプロキシの2つの方法がある - kasei_sanのブログ
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)
S3/Cloudfront vs EC2/load balancer for static (React.js) app : aws
master.keyが見つからない問題 [初見殺し] - はじめてのデプロイで嵌るポイント(Rails 5.2以降) - Qiita
既存のRailsアプリのRubyバージョンアップしてみた - Qiita
EC2とRDSを利用してRails 6 + MySQL 5のアプリケーションをAWS上で起動する | Enjoy IT Life