プログラミング

【GymCal】EC2を閉じてもReactとLaravelを実行し続ける方法

この記事は約7分で読めます。

EC2インスタンスでReactとLaravelをデプロイする方法を学んできましたが、現在はEC2 Instance Connectを閉じるとアプリケーションも終了してしまっています。

今回はsystemdを使用してバックグラウンドで実行し続ける方法を説明します。

ユニットファイルの作成

以下のコマンドでReactアプリケーションのsystemdユニットファイルを作成します。

Zsh
sudo vi /etc/systemd/system/frontend-app.service

ファイルに以下の内容を記述します。

Zsh
[Unit]
Description=Frontend React Application
# このサービスが依存しているターゲット。ネットワークが準備完了してから起動する
After=network.target

[Service]
# サービスの作業ディレクトリを指定
WorkingDirectory=/home/ec2-user/gymcal/frontend
# サービスを開始するコマンド
ExecStart=/home/ec2-user/.nvm/versions/node/v18.17.0/bin/serve -s build
# 常にサービスを再起動する設定
Restart=always
# サービスを実行するユーザー
User=ec2-user
# 環境変数設定。PATHを指定
Environment=PATH=/usr/bin:/usr/local/bin
# 環境変数設定。NODE_ENVを指定
Environment=NODE_ENV=production
# サービスをリロードするためのコマンド
ExecReload=/bin/kill -HUP $MAINPID
# プロセスを終了させる方法
KillMode=process
# 再起動間隔を指定
RestartSec=10

[Install]
# サービスが multi-user ターゲットで有効になるように指定
WantedBy=multi-user.target

同様に以下のコマンドでLaravelアプリケーションのsystemdユニットファイルを作成します。

Zsh
sudo vi /etc/systemd/system/backend-app.service

ファイルに以下の内容を記述します。(vi /etc/systemd/system/frontend-app.service

Zsh
[Unit]
Description=Backend Laravel Application
# このサービスが依存しているターゲット。ネットワークが準備完了してから起動する
After=network.target

[Service]
# サービスの作業ディレクトリを指定
WorkingDirectory=/home/ec2-user/gymcal/backend
# サービスを開始するコマンド
ExecStart=/usr/bin/php artisan serve --host=0.0.0.0 --port=8000
# 常にサービスを再起動する設定
Restart=always
# サービスを実行するユーザー
User=ec2-user
# 環境変数設定。PATHを指定
Environment=PATH=/usr/bin:/usr/local/bin
# 環境変数設定。APP_ENVを指定
Environment=APP_ENV=production
# サービスをリロードするためのコマンド
ExecReload=/bin/kill -HUP $MAINPID
# プロセスを終了させる方法
KillMode=process
# 再起動間隔を指定
RestartSec=10

[Install]
# サービスが multi-user ターゲットで有効になるように指定
WantedBy=multi-user.target

サービスの起動と有効化

ユニットファイルを作成したら、以下のコマンドでサービスを有効化し、起動します。

Zsh
# ユニットファイルの変更を systemd にリロード
sudo systemctl daemon-reload

# frontend のサービスを有効化して起動
sudo systemctl enable frontend-app
sudo systemctl start frontend-app

# backend のサービスを有効化して起動
sudo systemctl enable backend-app
sudo systemctl start backend-app

各サービスのステータスは、以下のように確認できます。

Zsh
$ sudo systemctl status frontend-app.service
 frontend-app.service - Frontend React Application
     Loaded: loaded (/etc/systemd/system/frontend-app.service; enabled; preset: disabled)
     Active: active (running) since Wed 2024-08-21 00:06:57 UTC; 1min 8s ago
   Main PID: 15108 (node)
      Tasks: 15 (limit: 1112)
     Memory: 69.6M
        CPU: 625ms
     CGroup: /system.slice/frontend-app.service
             └─15108 node /home/ec2-user/.nvm/versions/node/v18.17.0/bin/serve -s build

Aug 21 00:06:57 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal systemd[1]: Started frontend-app.service - Frontend React Application.
Aug 21 00:06:58 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal serve[15108]:  INFO  Accepting connections at http://localhost:3000

$ sudo systemctl status backend-app.service
 backend-app.service - Backend Laravel Application
     Loaded: loaded (/etc/systemd/system/backend-app.service; enabled; preset: disabled)
     Active: active (running) since Wed 2024-08-21 00:08:16 UTC; 23ms ago
   Main PID: 15256 (php)
      Tasks: 1 (limit: 1112)
     Memory: 4.8M
        CPU: 18ms
     CGroup: /system.slice/backend-app.service
             └─15256 /usr/bin/php artisan serve --host=0.0.0.0 --port=8000

Aug 21 00:08:16 ip-172-31-38-157.ap-northeast-1.compute.internal systemd[1]: Started backend-app.service - Backend Laravel Application.

手動再起動の方法

Git でアプリケーションのバージョンを更新した際に手動で再起動する方法を説明します。

Gitで新しいバージョンを取得した後、以下のコマンドでアプリケーションを再起動できます。

Zsh
sudo systemctl restart frontend-app
sudo systemctl restart backend-app

まとめ

以上でsystemd が React アプリケーションと Laravel アプリケーションを管理し、サーバーの再起動時や障害発生時に自動的に起動と再起動を行う設定ができます。

コメント