web-dev-qa-db-ja.com

WSGIアプリケーションをどのようにデプロイしますか? (そしてなぜそれが最良の方法であるか)

WSGIアプリケーションのデプロイ。この猫の皮を剥ぐ方法はたくさんあります。現在、mod-wsgiでApache2を使用していますが、これにはいくつかの潜在的な問題があります。

では、どうすればそれを行うことができますか?

  1. Apache Mod-wsgi(他のmod-wsgiは価値がないようです)
  2. 純粋なPython Webサーバー(例:ペースト、チェリーピー、スポーン、Twisted.web)
  3. 2と同じですが、nginx、Apache2などからのリバースプロキシを使用し、静的ファイルを適切に処理します
  4. ブリッジ(Flupなど)を使用し、従来のWebサーバーで実行されているFCGIなどの他のプロトコルへの変換。

もっと?

私はあなたがそれをどのように行うのか、そしてなぜそれがそれを行うための最良の方法であるのか知りたいです。私は絶対にあなたが何と理由、アプリケーション固有のものなどについての詳細で私を退屈させるでしょう。私はどんな非狂気の答えにも賛成します。

42
Ali Afshar

いつものように:それは異なります;-)

Apacheの機能が必要ないときは、純粋なpythonペーストなどのWebサーバーを使用します。どれがアプリケーションに正確に依存し、いくつかのベンチマークを実行することで決定できます。私は常にいくつかやりたかったのですが、実現しませんでした。スポーンには、ノンブロッキングIOをそのまま使用することでいくつかの利点があるかもしれませんが、パッチを適用しているために問題が発生することがありました。

もちろん、ニスを前に置くことも自由です。

Apacheが必要な場合は、プロセスを分離しておくことができるように、通常はソリューション3を使用します。また、プロセスを他のサーバーなどに簡単に移動することもできます。私は単に物事を分離しておくのが好きです。

静的ファイルの場合、現在、静的画像/ css/jsのみを提供するプロジェクト用に別のサーバーを使用しています。優れたパフォーマンスを発揮するWebサーバーとしてlighttpdを使用しています(この場合、前にニスはありません)。

もう1つの便利なツールは、これらのサービスを制御および監視するための supervisord です。

さらに、デプロイメントと開発サンドボックスの管理に buildout を使用しています( virtualenv と一緒に)。

27
MrTopf

何と理由、アプリケーション固有のものなどの詳細で私を退屈させてください。

ホー。さてあなたはそれを求めました!

ダニエルのように、私は個人的にmod_wsgiでApacheを使用しています。それはまだ十分に新しいので、いくつかの環境でそれを展開するのは苦労する可能性がありますが、とにかくすべてを自分でコンパイルしているのであれば、それはかなり簡単です。初期のバージョンでさえ、非常に信頼できることがわかりました。グラハム・ダンプルトンがほとんど自分でコントロールできるようにするための小道具。

ただし、私にとっては、WSGIアプリケーションがすべての可能なサーバーで機能することが不可欠です。現在、この領域には少し穴があります。WSGI呼び出し可能オブジェクト(アプリケーション)が何をするかを示すWSGI標準がありますが、デプロイメントの標準化はありません。アプリケーションの場所をWebサーバーに伝える単一の方法はありません。また、更新時にサーバーにアプリケーションを再ロードさせる標準化された方法もありません。

私が採用したアプローチは次のとおりです。

  • モジュール/パッケージ、できればクラス内のすべてのアプリケーションロジック

  • メインアプリケーションをサブクラス化し、メンバーをオーバーライドすることによって行われるすべてのWebサイト固有のカスタマイズ

  • クラス__init __()パラメーターとしてのすべてのサーバー固有のデプロイメント設定(データベース接続ファクトリ、メールリレー設定など)

  • 現在のサーバーの正しいデプロイメント設定でApplicationクラスを初期化し、CGIスクリプト、mod_wsgi WSGIScriptAlias(またはPassenger、Passenger、)としてデプロイできるようにアプリケーションを実行する1つのトップレベルの「application.py」スクリプトこれは明らかに同じように機能します)、またはコマンドラインから対話できます

  • 上記のデプロイメントの問題を処理し、アプリケーションが変更に依存しているモジュールのときにアプリケーションを再ロードできるようにするヘルパーモジュール

したがって、application.pyが最終的にどのように見えるかは次のようになります。

#!/usr/bin/env python

import os.path
basedir= os.path.dirname(__file__)

import MySQLdb
def dbfactory():
    return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p')

def appfactory():
    import myapplication
    return myapplication.Application(basedir, dbfactory, debug= False)

import wsgiwrap
ismain= __name__=='__main__'
libdir= os.path.join(basedir, 'system', 'lib')
application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)

Wsgiwrap.Wrapperは、libdir内のアプリケーションモジュールのいずれかが更新されているかどうかを10秒ごとにチェックし、更新されている場合は、すべてを確実にアンロードするための厄介なsys.modulesマジックを実行します。次に、appfactory()が再度呼び出され、更新されたアプリケーションの新しいインスタンスが取得されます。

(次のようなコマンドラインツールを使用することもできます

./application.py setup
./application.py daemon

呼び出し可能なアプリケーションによって提供されるセットアップフックとバックグラウンドタスクフックを実行します—distutilsの動作と少し似ています。また、initスクリプトのように開始/停止/再起動に応答します。)

私が使用するもう1つのトリックは、複数のサーバー(開発/テスト/本番)のデプロイメント設定を同じapplication.pyスクリプトに入れ、「socket.gethostname()」をスニッフィングして、使用するサーバー固有の設定を決定することです。

ある時点で、wsgiwrapをパッケージ化して、適切にリリースする可能性があります(おそらく別の名前で)。それまでの間、興味がある場合は、 http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py でdogfood-developmentバージョンを確認できます。

13
bobince

デプロイするのに絶対に簡単なのはCherryPyです。 Webアプリケーションは、スタンドアロンのWebサーバーになることもできます。 CherryPyは、純粋なPythonで記述されていることを考えると、かなり高速なサーバーでもあります。そうは言っても、それはApacheではありません。したがって、CherryPyは少量のWebアプリに適していることがわかりました。

それ以外に、この質問に対する正しい答えも間違った答えもないと思います。多くの大量のWebサイトは、あなたが話しているテクノロジーに基づいて構築されており、これらの方法のいずれかを間違えることはないと思います(ただし、mod-wsgiがすべてに対応していないことに同意します)非Apacheサーバー)。

また、私は isapi_wsgi を使用してIISでpythonアプリをデプロイしています。これは理想的なセットアップではありませんが、機能し、常に選択できるとは限りません。それ以外の場合は、ウィンドウ中心の世界に住んでいます。

13
Jason Baker

Nginxリバースプロキシと静的ファイル共有+ XSendfile + uploadprogress_module。その目的のためにそれに勝るものはありません。

WSGI側では、Apache + mod_wsgiまたはcherrypyサーバーのいずれか。メモリとリクエストが少ないサーバー上のアプリケーションには、cherrypywsgiサーバーを使用するのが好きです。

理由:

さまざまな人気のあるソリューションに対して、さまざまなツールを使用してベンチマークを実行しました。

私はWeb開発、特にhttp実装よりも低レベルのTCP/IPの経験が豊富です。優れたWebフレームワークを認識できるよりも、優れたhttpサーバーを認識できると確信しています。

TwistedはDjangoまたはPylonsよりもはるかに多いことを知っています。Twistedのhttpスタックはまだこれまでではありませんが、存在するでしょう。

6
Vasil

TurboGears(2.0)

TurboGears 2. は来月以内にベータ版を離れます(かなり長い間そこにいました)。 2.0は1.0シリーズを改良し、最高のWSGIスタックを提供しようとするため、煩わしさを最小限に抑えたい場合は、デフォルトでいくつかの選択を行います。

1.xシリーズでテストおよびデプロイするためのtg*ツールがありますが、2.0シリーズではpasterに相当するものに変換されています。これは、pylonsの経験があればおなじみのようです。 。

 tg-adminクイックスタート—>パスタークイックスタート
 tg-admin情報—>パスターtginfo 
 tg-adminツールボックス–>パスターツールボックス
 tg-adminシェル–> paster Shell 
 tg-admin sql create –> paster setup-app development.ini 

パイロン

WSGIスタック(ORMの選択、テンプレート作成者の選択、フォーミングの選択)でより柔軟になりたい場合は、Pylonsが統合された選択肢になりつつあります。これは私の推奨する選択になります。これは、優れたドキュメントを提供し、さまざまなコンポーネントを試すことができるためです。

結果として作業するのは楽しいことであり、Apache(本番デプロイメント)またはスタンドアロン(テストおよび実験段階に役立ちます)で動作します。

したがって、Pylonsで両方を行うことができます。

  • テスト段階の2つのオプション(pythonスタンドアロン)

  • 4スケーラブルな本番用(FastCGI、選択したデータベースが維持できると仮定)

Pylons管理インターフェースはTurboGearsと非常によく似ています。これがおもちゃスタンドアロンの例です:

 $ paster create -t​​ pylons helloworld 
 $ cd helloworld 
 $ paster serve --reload development.ini

実稼働クラスのデプロイメントについては、Apache + FastCGI + mod_rewriteのセットアップガイドを参照できます ここ 。これはほとんどのニーズに合わせてスケールアップします。

4
popcnt

開発中のアプリケーションにGoogleAppEngineを使用しています。 WSGIアプリケーションを実行します。 ここにいくつかの情報があります。

これは私が実際に取り組んだ最初のウェブアプリなので、比較の根拠はありませんが、Googleファンの場合は、調べてみることをお勧めします。学習のフレームワークとして使用するのはとても楽しいです。

4
Baltimark

Web.py(wsgiアプリケーション)を使用したApache httpd + mod_fcgid。

チャームのように機能します。

3
Bjorn

Apache + mod_wsgi、

シンプルで清潔。 (Webサーバー構成の4行のみ)、他のsysadimnsが頭を動かすのは簡単です。

1

一部のWebサービスには純粋なPasteを使用しています。デプロイは簡単で(内部デプロイメントメカニズムを使用します。PasteDeployなどは使用していません)、本番システムと開発者のワークステーションで実行されているシステムとの違いを最小限に抑えることができます。警告:リクエストは重いため、Paste自体のレイテンシが低くなることは期待できません。いくつかの大まかなベンチマークでは、得られませんでした素晴らしい結果;私たちの典型的なリクエストハンドラーの費用のために、それは結局議論の余地がありました。これまでのところ、それはうまく機能しています。

静的データは、S3、Akamai、Apache、IISの使用など、完全に分離された(そしてある程度「有機的に」成長した)スタックによってさまざまな方法で処理されてきました。

1