yamaday0u Blog Written by yamaday0u

【初学者におすすめ】EC2にNginxとReactでWebサーバーを立てるデモ

Web

こんにちは、やまだゆうです。

今回はAmazon Linux 2023で起動したEC2にNginxとReactでWebサーバーを立てるデモンストレーションを見せたいと思います。

ちょっと長いですが、頑張って付いてきてください!

この記事の内容

  1. なぜやるのか:基礎理解のため
  2. Reactアプリの用意
  3. Amazon Linux 2023にNginxをインストール
  4. ReactアプリをEC2上に配置
  5. Nginxの設定
  6. トラブルシューティング:なぜ500エラーが出るのか

スポンサーリンク

なぜやるのか:基礎理解のため

仕事で他のチームが作ったReactアプリをAWSにどのように構築するか検討する機会がありました。

ちょっと調べてみるとNginxと組み合わせてWebサーバーを構築している事例が多かったので初めてNginxを使ってみました。

仕事の方の検討は完了したので、落ち着いてNginx+ReactでWebサーバーの構築を理解したいと思い復習を目的にしています。

エンジニアへの転職を目指して勉強している方にも理解しやすいよう手順にこだわって書いていますので、本記記事をぜひ役に立ててください!

Reactアプリの用意

まずはReactアプリを用意しましょう。最近ホットなVite(ヴィート)でプロジェクトを作ります。

ここではNPMを介してVite + Reactのプロジェクトを作りますが、公式で紹介されている他のコマンドから作っても構いません。

npm create vite@latest

上記コマンドを実行するとプロジェクト名を求められます。なんでもいいので初期名のvite-projectのままエンターキーを押します。

初期名のvite-projectのままエンターキーをクリック

続いて使用するフレームワークを聞かれます。Reactを選択しましょう。

Reactを選択してエンターキーをクリック

最後にどの組み合わせで使いたいか問われます。かっこいいのでTypeScriptを選択します。

TypeScriptを選択してエンターキーをクリック

これでプロジェクトが作られました。次の案内に従ってプロジェクトを実行してみましょう。

案内にしたがってコマンドを実行

npm run devを実行するとlocalhost:5173でReactアプリが起動されます。

Reactアプリが立ち上がりました。

これでReactアプリの用意が完了しました。

スポンサーリンク

Amazon Linux 2023にNginxをインストール

EC2を起動する

まずはAWSでEC2を起動します。

Amazon Linux 2023(以下、「AL2023」)でEC2を起動しましょう。ぼくはこんな感じで作りました。VPCやサブネットはAWSアカウント作ったときに用意されるデフォルトのものを使ってます。
使ったマシンイメージはami-0ad215c298e692194(al2023-ami-2023.4.20240528.0-kernel-6.1-arm64)です。

AL2023のARM64アーキテクチャのAMIからEC2を起動

SSM接続でのサーバー接続とS3へのアクセスを行うので、IAMロールはAmazonSSMManagedInstanceCoreAmazonsS3FullAccessというポリシーを当てましょう。

AmazonSSMManagedInstanceCoreポリシーとAmazonsS3FullAccessポリシーを付与したIAMを用意する
デモンストレーション用に権限が大きいポリシーを当てていますが、本番運用ではカスタムで権限を絞ったポリシーを用意して当てましょう。

EC2にNginxをインストール

EC2に接続したらec2-userにログインします。

sudo su --login ec2-user

AL2023ではDNFがパッケージ管理ツールです。これを使ってNginxをインストールします。

sudo dnf update
sudo dnf install nginx -y

nginxコマンドが使えればインストール完了です。

nginx -v
# nginx version: nginx/1.24.0

ReactアプリをEC2上に配置

Reactアプリをビルド

さきほど作成したReactアプリをビルドしましょう。Reactアプリのルートディレクトリに移動して以下のコマンドを実行します。

npm run build

ビルドが完了するとdistディレクトリが作成されます。(初期設定のままの場合)

distディレクトリが作られる

いったんS3にソースコードをアップロードするためにdistディレクトリの内容をzipファイルに纏めます。

zip react-app -r dist

S3バケットにソースコードをアップロードする

S3バケットを用意しましょう。名前以外は初期設定のままで作ってください。

S3バケットを作る

先ほど作ったzipファイルをバケットの直下にアップロードします。アップロードしたら、ファイルのS3 URIをコピーしておきます。

S3からEC2にReactアプリをコピーする

再びEC2にSSM接続して、ec2-user直下にappフォルダを作ります。

sudo su --login ec2-user
mkdir app

S3にアップロードしたReactアプリのソースコードをEC2にコピーします。

aws s3 cp *先ほどコピーしたS3 URI* app/

コピーしたソースコードを解凍します。

cd app
unzip react-app.zip

スポンサーリンク

Nginxの設定

Nginxの設定を行います。

sudo vim /etc/nginx/nginx.conf

http > serverディレクティブ内のerror_pageの前に以下の設定を追加しましょう。

location / {
        root /home/ec2-user/app/dist;
        index $uri /index.html;
}
error_pageの前に設定を追加

Nginxのサービスを起動します。

sudo systemctl enable --now nginx.service

EC2インスタンスのパブリック IPv4 アドレスにhttpで接続します。すると以下の画像のようなエラー画面が出ます。

エラーが表示される

トラブルシューティング:なぜ500エラーが出るのか

これはかなり解決に時間がかかったエラーです。原因はルートディレクトリからReactアプリがあるディレクトリまでにnginxユーザーが実行できないディレクトリがあることです。

参考:【nginx】アクセス権限が正しいのにPermission deniedになるときの原因と対処 – 新米エンジニアの失敗再発防止メモ

本件でいえば、/home/ec2-userディレクトリに実行権限がありません。

その他のユーザーに実行権限権限(x)がない

ということで、その他のユーザーに実行権限を与えます。

sudo chmod 701 /home/ec2-user

もう一度/home/ec2-userディレクトリの権限を確認すると、その他のユーザーでも実行できるようになりました!

その他のユーザーに実行権限権限(x)が付与されました!

これで再度サイトにアクセスすると、無事にReactアプリが表示できました!

yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村