FastCGIプロセスのスムーズな再起動-django_graceful

djangoプロジェクトをデプロイするすべての方法のうち、私のお気に入りはFastCGIです。 ほとんどのWebサーバーでサポートされており、アクセス権を明確に区別することができ、他にも多くの利点があります。



ただし、djangoではその実装に欠陥がないわけではありません。 FastCGIサーバーを起動するには、かなり多くのパラメーターを使用して "./manage.py runfcgi"を実行する必要があります。覚えていれば、毎回必ず書き込みたいとは思わないでしょう。 そして、これが戦闘サーバー上のプロジェクトコードの更新のコンテキストで発生する場合、さらに多くのチームが存在します。 プロジェクトを詰まらせる、さまざまなラッパーを作成して起動および再起動する必要があります。



ところで、コードを更新するために実行する再起動には別の問題が伴います。 DjangoはFastCGIサーバーのスムーズな再起動を提供しません。 古いプロセスのみを終了してから、新しいプロセスを開始できます。 これはすぐには発生しないため、古いプロセスが終了してから新しいプロセスがポートを開くまでの間に、訪問者はエラー502を確認します。これはもちろん、サイトに対する信頼を高めるものではありません。 さまざまなトリックを考え出し、ラッパースクリプトを複雑にする必要があります。



これらのスクリプトの1つから、これらすべての問題を解決するかなり普遍的なdjango_gracefulアプリケーションが成長しました。 彼のアイデアはシンプルです。FastCGIの設定はsettings.pyファイルに保存され、manage.pyのシンプルなコマンドはFastCGIプロセスの制御に使用されます。 これらのコマンドは、いくつかの並列実行FastCGIサーバーインスタンスをサポートし、unixソケットファイルへのシンボリックリンクを使用して、つまりWebサーバーを再起動せずに、それらの間でWebサーバーを切り替えることができます。



この状況により、このようなトリックを増やすことができます。コードを更新する必要がある場合、Webサーバーが現在アクセスしていない1つのコマンドでFastCGIプロセスを再起動し、その後、要求を再度処理する準備ができたら、シンボリックリンクを切り替えます。 スイッチの前に接続されたクライアントは、最初のFastCGIサーバーによって引き続き提供され、新しいクライアントは2番目のFastCGIサーバーによって引き続き提供されます。 このアクションにはサーバー管理者権限さえ必要ありません。 テストでは、要求のストリームが非常に密集していても、サービスの中断は発生しないことが示されました。 ちなみに、このアプリケーションは、 Tranio.Ruの海外不動産プロジェクトで最初に使用されましたが、現在でもそこで機能しています。



インストール方法は?

  1. アプリケーション自体は、easy_install django_gracefulコマンドを使用してダウンロードおよびインストールできます。
  2. 次に、アプリケーション名「django_graceful」をプロジェクトのINSTALLED_APPSリストに追加する必要があります。
  3. settings.pyファイルで、もう1つのオプションGRACEFUL_STATEDIRを追加する必要があります。 FastCGIプロセスの.pidおよび.socketファイルが保存されるフォルダーへの絶対パスを含める必要があります。
  4. 「./manage.py runfcgi」コマンドに追加オプションを指定することで、GRACEFUL_OPTIONSディクショナリをsettings.pyに追加することもできます。
  5. GRACEFUL_STATEDIRフォルダーにシンボリックリンク「fastcgi.socket」が作成されます。このフォルダーへのパスは、Webサーバー構成で指定する必要があります。 たとえば、nginxの「FastCGI_pass unix:/home/web/project/var/run/fastcgi.socket」。


使い方



django_gracefulを簡単にする一般的なタスクを次に示します。



実行状態のFastCGIサーバーの最初の起動とサポート:


./manage.py keepaliveは、少なくとも1つのFastCGIプロセスが実行されているかどうか、およびリンクがそれを指しているかどうかを確認するコマンドです。 実行中のプロセスがない場合は、最初のプロセスが開始されます。 リンクが解放されていないプロセスを示している場合、コマンドは実行中のプロセスのソケットに切り替えます。 そうでなければ、彼女は何もしません。



このコマンドをcrontabに追加して、1分間に1回実行するのが大好きです。 予期しないクラッシュまたは予定外のサーバーの再起動後にFastCGIが発生します。



コード更新後のFastCGIのスムーズな再起動:


./manage.py update-非アクティブなFastCGIプロセスを再起動してリンクを設定して、上記のフォーカスを実行するコマンド。



チームの全リスト





以上です! このアプリはgithub.com/andreiko/django_gracefulにあります

あなたの展開と高い稼働時間に便利です:)



All Articles