(当記事は、こちらの記事の翻訳になります。)
最近、私は自分のビジネスを始めました(今年中に自分の会社を設立する予定です)。そして、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:
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
*/1 * * * * /usr/local/bin/rst
crontabを設定するには、crontab -eというコマンドを使います。
先ほどお話したように、このコマンドは1分ごとに実行されるので、ウェブサーバの問題を素早く検出することができます。
はい、そんな感じです。
ツイッター @keisuganodev
keitaroimo.bandcamp.com
No comments:
Post a Comment