Monday, April 19, 2021

webアプリの自動的な再起動の方法(Linux)

(当記事は、こちらの記事の翻訳になります。)

最近、私は自分のビジネスを始めました(今年中に自分の会社を設立する予定です)。そして、Django.で自分のウェブページを作成しました(https://www.suganolab.com)。

まだ、URLやプロトコルのルーティングの問題が残っていますが、今のところうまくいっています。しかし、このウェブサイトには大きな問題があります。

事後分析はしていませんが、特定の間隔でウェブページが接続タイムアウトエラーを返します。djangoなので、次のようにコマンドを実行すると

ps aux | grep manage.py

というコマンドを実行しましたが、まだプロセスは生きています。何が問題なのでしょうか?これまでのところ、根本的な原因を正確に把握する時間がありませんでしたが、もしかしたら

1. インスタンスのメモリ/CPUが、Webアプリが処理するプロセスに耐えられない。

2.Webサイトに大量のアクセスがあると、クライアントとWebサイトの間にロードバランサーがないため、Webアプリに負荷がかかりすぎてプロセスが壊れてしまう。

では、どのように解決すればよいのでしょうか?もしかしたら、(1)インスタンスのスケールアウト(メモリ、vCPU)か、ロードバランサーを追加することが一番の解決策かもしれません。

しかし、私の記憶では、AWS/GCP上でロードバランサーを追加すると余分な費用がかかりますし、今回は、私のサイドビジネスでは固定額の収益がないので、ロードバランサーは必要ありませんでした。サブスクリプションでもない限り、自分のウェブサイトにロードバランサーをホスティングするのは良いアイデアとは思えない。(私の偏見かもしれませんが)

そこで、以下のようなアイデアを思いつきました。

1. https://www.suganolab.com に接続するスクリプトを作成し、2秒以内に接続がタイムアウトするかどうかをチェックする。

2. (1.)が真であれば、djangoウェブアプリを再起動する。

3. crontabにスクリプトを追加し、1分ごとに実行する。サーバが稼働している場合、スクリプトはウェブアプリを再起動しないので、全く気になりませんが、サーバが停止している場合は、ウェブアプリが再起動されます。

以下は、1.と2.のスクリプトです。

res=$(timeout 2 curl https://www.suganolab.com) 
if [ -z $res ]; then 
       echo "$date : ウェブアプリの再起動..." | tee ~/.log 
       rp & 
else 
       echo "$date : web app healthy" | tee ~/.log 
fi

timeoutコマンドを使って、ウェブサイトへのcurlアクセスがタイムアウトしたかどうかをチェックするだけの簡単なスクリプトです。

crontabの内容は以下の通りです。

tobasojyo_gmail_com@manga:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
*/1 * * * * /usr/local/bin/rst​

crontabを設定するには、crontab -eというコマンドを使います。

先ほどお話したように、このコマンドは1分ごとに実行されるので、ウェブサーバの問題を素早く検出することができます。

はい、そんな感じです。

ツイッター @keisuganodev

keitaroimo.bandcamp.com 

No comments:

Post a Comment