新しいバージョンをデプロイすると、Djangoバックエンドがハングします。住所はすでに使用中です。

新しいバージョンをデプロイすると、Djangoバックエンドがハングします。住所はすでに使用中です。

GitHub Webhookを介して自動的に呼び出される単純なデプロイスクリプトを使用して、Debianサーバー上で実行されるDjangoアプリケーションがあります。

#!/bin/sh
git pull
/home/criticalnotes/.local/bin/poetry install --with prod --sync
/home/criticalnotes/.local/bin/poetry run ./manage.py migrate
sudo /usr/sbin/service api.critical-notes.com restart
echo "service api.critical-notes.com restarted"

したがって、このデプロイスクリプトはgitから最新のコードを取得し、依存関係をインストールし、移行スクリプトを実行してからサービスを再起動します。

私のapi.critical-notes.com.serviceファイル:

[Unit]
Description=api.critical-notes.com

[Service]
User=criticalnotes
Group=criticalnotes
Restart=on-failure
WorkingDirectory=/home/criticalnotes/api.critical-notes.com
ExecStart=/home/criticalnotes/.local/bin/poetry run uvicorn criticalnotes.asgi:application --log-level warning --workers 8 --uds /tmp/uvicorn.sock

[Install]
WantedBy=multi-user.target

この設定は長い間うまくいきましたが、今日GitHubに新しいコードをプッシュすると、サイトの操作が中断されました。何が起こっているのかを調べた後、api.critical-notes.comサービスが実行されなくなり、エラーのために終了し続けることがわかり、バックエンドを手動で起動しようとしたときに次のエラーが発生しました。

Address already in use

特に、これまで何も起こらなかったし、今日(または最近)の展開や設定を変更したことがないので、この問題の原因は何であるかわかりません。だから私の質問はこれがどのように起こるかです。バックエンドが実行されていないときにアドレスを引き続き使用することはどのように可能ですか?第二に、これが何度も起こらないように展開スクリプトをどのように改善できますか?

コードプッシュに問題がある理由を特定しようとすると、バックエンドがオフラインで、サイトが約30分間オフラインになっていましたが、かなり怖かったです。こんなことが二度と起こらなかったらいいな

答え1

アプリケーションとデプロイプロセスの詳細を知らないと、この質問に確実に答えることはほとんど不可能です。一般的な問題には、構成スクリプトの競合、スケジュールされた範囲内のポートの使用、または最後の再起動で必要なバインディングを維持する遅延プロセスが含まれます。過去数ヶ月間に必要なライブラリ/依存関係(uvicorn、pythonなど)を更新した場合は、デフォルトの設定が変更された可能性があるため、正常に機能するには追加のパラメータを指定する必要があります。特に、起動スクリプトでUDSファイルを生成する必要がある場合は、UDSファイルに関連することもあります。何らかの理由で開いている状態でロックされていると、このようなエラーが発生する可能性があります。そのソケットの使用方法がわからない場合、ファイルが開いている根本的な原因はコードのほぼすべての部分にあるバグかもしれません。 (または最後のジョブ以降に更新された依存関係。)

詳細を追加したことが確認されたら、戻ってもう少し具体的な回答で編集してみましょう。しかし、これが少なくとも正しい方向を示してくれることを願っています。

答え2

住所はすでに使用中です。

これが実際にここで考慮すべき唯一のものです。サービスが使用するアドレス(特にポート)を指定していません。 Webサービスの場合、そのポートはおそらく80および/または443です。このポートを使用するものは何かを調べる必要があります。 Debianのバージョンに応じて使用するコマンドは(root)netstat -nap | grep :80またはss -nlp | grep :80

以下を使用して、関連ポートでリッスンしているエントリがあるかどうかを確認することもできます。nc -zv localhost 80

(443回繰り返し)

実際に何も聞かない場合は、サーバーが2回自己起動しようとしているように聞こえます。

systemctl status api.critical-notes.com出力を表示し、ターミナルセッションで実行したときに何が起こるかを確認することもできます。systemctl restart api.critical-notes.com

関連情報