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 アプリケーションを管理し、サーバーの再起動時や障害発生時に自動的に起動と再起動を行う設定ができます。
コメント