5

Django と Python 2.6 で構築された新しい Web サイトをクラウドにデプロイしました (流行語に準拠し、Amazon マイクロ EC2 インスタンスは無料です!)。
詳細なメモは次のとおりです

これは新しいサイトなので (そして最新かつ最高のサイトでプレイしたいので)、Supervisor の上に Nginx と Gunicorn を使用しました。
YUM / easy_install を使用してトランクからインストールされたすべてのソフトウェア。
私のデータベースはSqliteです(今のところ-次にどこに行くべきかはわかりませんが、それは問題ではありません). todo リストにもあります: virtualenv + pip。
ここまでは順調ですね。
私のコードはSVNにあります。デプロイする単純な fabfile を作成しました。最新のコードをチェックアウトし、Supervisor を介して Gunicorn を再起動します。DNS 名を Elastic IP にフックしました。
できます。

私の質問は、サービスを中断せずにサイトを更新するにはどうすればよいですか? 小さな更新スクリプトを実行すると、サイトのユーザーに 404 / 500 が返されます。

別のサーバーを追加せずにこれを行う方法はありますか (価格が重要です)?

ステージング システム (別のポート上?) と、ステージングと本番の間のシームレスな切り替えが欲しいです。同じ(無料)サーバー上。ファブリック経由。
それ、どうやったら出来るの?両方のサイトを実行しているのは同じ Nginx ですか? 本番環境に影響を与えずにステージングをアップグレードできますか? ファブファイルはどのようになりますか? ディレクトリツリーはどのようになりますか?

ありがとう!

タル。

関連している:

4

2 に答える 2

3

Nginx を使用すると、リバース プロキシのフェイルオーバーをセットアップできます。1 つの gunicorn インスタンスをプライマリとして配置できます。そのバージョンが実行されている限り、フェイルオーバーを確認することはありません。

新しいバージョンがフェールオーバー インスタンスに含まれるようにサイトを構成する場合は、サイトの新しいバージョンで障害インスタンスを更新するために fab ファイルを記述し、準備ができたらプライマリ インスタンスをオフにするだけです。Nginx は 2 番目のインスタンスにシームレスにフェイルオーバーし、ダウンタイムなしで新しいバージョンを実行しています。

その後、プライマリ バージョンを更新してからオンに戻すと、プライマリがライブになります。この時点で、万一に備えてフェールオーバー インスタンスを実行し続けることも、オフにすることもできます。

考慮すべきいくつかのこと。sqllite を使用している場合は、両方の gunicorn インスタンスが sqllite ファイルにアクセスできることを確認してください。

通常のデータベースを使用している場合、これはそれほど問題ではありません。新しいバージョンに切り替える前に、新しいバージョンに必要なデータベースの移行を適用することを確認する必要があります。

それらが下位互換性のある変更である場合、それは大したことではありません。下位互換性がない場合は注意してください。新しいバージョンに切り替える前に、サイトの古いバージョンを壊してしまう可能性があります。

簡単にするために、異なる仮想環境でバージョンを実行します。

Supervisord を使用して gunicorn を制御する場合は、supervisorctl コマンドを使用して、他のインスタンスに影響を与えることなく、デプロイするインスタンスをリロード/再起動できます。

それが役立つことを願っています

これはnginx構成の例です(完全な構成ファイルではなく、重要でない部分を削除しました)

これは、プライマリの gunicorn インスタンスがポート 9005 で実行され、もう一方のインスタンスがポート 9006 で実行されていることを前提としています。

upstream service-backend {
    server localhost:9005;        # primary
    server localhost:9006 backup; # only used when primary is down
}

server {
    listen 80;
    root /opt/htdocs;
    server_name localhost;

    access_log /var/logs/nginx/access.log;
    error_log  /var/logs/nginx/error.log;

    location / {
        proxy_pass http://service-backend;
    }
}
于 2011-06-21T10:37:41.967 に答える
1

gunicornに正常に再起動するように指示する方法を理解する必要があるようです。あなたがしなければならないのは、アプリをリロードするように通知するときに、gunicornプロセスにHUPを発行することだけのようです。についてのリンクで説明されているように、gunicornのドキュメントはそれを行う方法を説明しています。

于 2011-06-21T08:06:49.313 に答える