Python Webフレームワーク、WSGI、およびCGIを組み合わせる方法


150

PythonスクリプトをCGIとして実行できるBluehostアカウントを持ってます。実行するには次のように定義する必要があるため、これは最も単純なCGIだと思います.htaccess

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

さて、PythonでWebプログラミングを調べるたびに、WSGIについて、そしてほとんどのフレームワークがそれをどのように使用するかについて、よく耳にします。しかし、特にWebサーバー(ホストのマシンで実行されているApache)が提供されており、実際に操作できるもの(.htaccessコマンドの定義を除く)が与えられていない場合、それらがどのように適合するかを理解できません。

どのようにしているWSGI、CGI、およびフレームワークは、すべての接続されていますか?基本的なCGI構成でWebフレームワーク(たとえばweb.pyまたはCherryPy)を実行したい場合、何を知ってインストールし、実行する必要がありますか?WSGIサポートのインストール方法は?

回答:


242

WSGI、CGI、およびフレームワークはすべてどのように接続されていますか?

Apacheはポート80で待機します。HTTPリクエストを取得します。リクエストを解析して、応答する方法を見つけます。Apacheは対応する選択肢がたくさんあります。応答する1つの方法は、CGIを使用してスクリプトを実行することです。応答する別の方法は、単にファイルを提供することです。

CGIの場合、Apacheは環境を準備し、CGIプロトコルを介してスクリプトを呼び出します。これは、標準のUnix Fork / Execの状況です。CGIサブプロセスは、ソケットとstdoutを含むOS環境を継承します。CGIサブプロセスは、Apacheに戻る応答を書き込みます。Apacheはこの応答をブラウザーに送信します。

CGIは原始的で迷惑です。ほとんどの場合、リクエストごとにサブプロセスをフォークし、サブプロセスはstdoutとstderrを終了または終了して、応答の終了を示す必要があるためです。

WSGIは、CGI設計パターンに基づくインターフェースです。これは必ずしもCGIである必要はありません-要求ごとにサブプロセスをフォークする必要はありません。CGIでもかまいませんが、そうである必要はありません。

WSGIは、いくつかの重要な方法でCGI設計パターンに追加されます。HTTPリクエストヘッダーを解析して、環境に追加します。これは、POST指向の入力を環境内のファイルのようなオブジェクトとして提供します。また、多くのフォーマットの詳細からあなたを救う応答を公式化する関数を提供します。

基本的なCGI構成でWebフレームワーク(web.pyまたはcherrypyなど)を実行したい場合、何を知っている/インストールする/する必要がありますか?

サブプロセスのフォークはコストがかかることを思い出してください。これを回避するには2つの方法があります。

  1. 組み込み mod_wsgiまたはmod_pythonApacheの内部のPythonを埋め込みます。プロセスはフォークされません。ApacheはDjangoアプリケーションを直接実行します。

  2. デーモン、 mod_wsgiまたはmod_fastcgiApacheがWSGIプロトコルを使用して別のデーモン(または「長期実行プロセス」)と対話できるようにします。実行時間の長いDjangoプロセスを開始してから、このプロセスと通信するようにApacheのmod_fastcgiを構成します。

mod_wsgi組み込みモードまたはデーモンモードのどちらでも機能することに注意してください。

mod_fastcgiを読むと、Djangoがflupを使用して、mod_fastcgiが提供する情報からWSGI互換のインターフェースを作成していることがわかります。パイプラインはこのように機能します。

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Djangoには、さまざまなインターフェース用の「django.core.handlers」がいくつかあります。

mod_fastcgiの場合、Djangoはmanage.py runfcgiFLUPとハンドラーを統合するを提供します。

mod_wsgiには、このためのコアハンドラがあります。

WSGIサポートのインストール方法は?

これらの指示に従ってください。

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

背景はこちらをご覧ください

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index


4
共有ホスティングを使用しているため、mod_wsgiをインストールできません。私が持っているのはfcgiサポートだけです。どうすればWSGIアプリを引き続き実行できますか?
Eli Bendersky、2009

3
+1これは優れた回答であり、私が考えている多くの(すべてではない)質問に答えます。この答えはまだ完全ではありません。CGIとWSGIについてよく説明しましたが、FASTCGIとWSGIの関係と違いは何ですか?どちらが良いですか?それらはどのように機能しますか?mod_pythonはどのようにして登場しましたか?

14
S.Lottは、「どちらが良い」と尋ねるのかについて文句を言うのではなく、「mod_wsgiはXとして、fastcgiはYとして優れている」と単純に述べないでください。OPにもっと具体的な質問がある場合は尋ねます。
Gregg Lind

7
@Greg Lind:単に「mod_wsgiはXよりも優れており、fastcgiはYよりも優れている」と述べないのはなぜですか?それはとても簡単ではないからです。XとYのセットの要素である、機能しない品質要素が数十あります。それらをすべて列挙することは困難です。関連する品質要因について具体的な質問をすることは、はるかに優れています。
S.Lott、2009年

4
注:runfcgiオプションは、バージョン1.7およびFastCGIサポートがDjango 1.9で削除されたため、廃止されました。
OBu

58

特にPEPを読んだ場合、Florianの回答は「WSGIとは」についての質問の一部に答えると思います。

最後に向けてあなたが提起する質問については:

WSGI、CGI、FastCGIなどはすべて、Webサーバーがコード実行し、生成される動的コンテンツを配信するためのプロトコルです。これを静的なWebサービスと比較してください。静的なWebサービスでは、プレーンHTMLファイルは基本的にそのままクライアントに配信されます。

CGI、FastCGI、SCGIは言語に依存しません。CGIスクリプトは、Perl、Python、C、bashなどで記述できます。CGIは、URLに基​​づいて、どの実行可能ファイルが呼び出される、およびどのように呼び出されるか(引数と環境)を定義ます。また、実行可能ファイルの終了後に戻り値をWebサーバーに返す方法も定義します。バリエーションは基本的に、より多くのリクエストを処理したり、レイテンシを削減したりできるように最適化されています。基本的な考え方は同じです。

WSGIはPythonのみです。言語にとらわれないプロトコルではなく、標準の関数シグネチャが定義されています。

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

これは完全な(制限されている場合)WSGIアプリケーションです。WSGIをサポートするWebサーバー(mod_wsgiを使用するApacheなど)は、要求が到着するたびにこの関数を呼び出すことができます。

これがすばらしい理由は、HTTP GET / POSTからCGIからPythonに変換し、途中で再び戻るという面倒なステップを回避できるためです。これは、より直接的でクリーンで効率的なリンケージです。

また、リクエストに対して実行する必要があるのが関数呼び出しだけの場合は、長時間実行されるフレームワークをWebサーバーの背後で実行するのがはるかに簡単になります。プレーンなCGIでは、個々のリクエストごとにフレームワーク全体起動する必要があります

WSGIをサポートするには、WSGIモジュール(mod_wsgiなど)をインストールするか、WSGIが組み込まれた(CherryPyなどの)Webサーバーを使用する必要があります。これらのどちらも可能でない場合は、PEPで提供されているCGI-WSGIブリッジを使用できます。


3
WSGI言語にとらわれないのはだれの愚かな考えでしたか?では何がポイントなのでしょうか?Python全体をApacheモジュールとして出荷することもできます。
Salman von Abbas

2
@SalmanPKトレードオフだと思います。確かに、選択した言語で関数を実装するだけで使用できる言語にとらわれないプロトコルを作成することは(不可能ではないにしても)簡単ではありません。
phunehehe 2013

21

Pep333が例として示すように、CGIを介してWSGIを実行できます。ただし、リクエストがあるたびに新しいPythonインタープリターが開始され、コンテキスト全体(データベース接続など)を構築する必要があります。

WSGIを実行する場合、ホストがmod_wsgiをインストールし、適切な構成を作成して、アプリケーションの制御を委譲するのが最適です。

Flupは、FCGISCGI、またはAJPを話すことができる任意のWebサーバーでWSGIを使用して実行するもう1つの方法です。私の経験では、FCGIのみが実際に機能し、mod_fastcgiを介して、またはmod_proxy_fcgiを使用して別のPythonデーモンを実行できる場合は、Apacheで使用できます。

WSGIは、CGIによく似たプロトコルであり、WebサーバーとPythonコードがどのように相互作用するかについて一連のルールを定義し、Pep333として定義されています。。。これにより、多くの異なるWebサーバーが、同じアプリケーションプロトコルを使用して、多くの異なるフレームワークやアプリケーションを使用できるようになります。これは非常に有益であり、非常に便利です。


3
CGIを介してWSGIを実行しているのは、 "flup"が何のためにあるのですか?flupはどのようにスキームに接続されていますか?
Eli Bendersky、2008年

7

このスペースのすべての用語が不明確で、それに直面させようとする場合、混乱を招く頭字語が混じったものです。また、CGI対FastCGI対WSGIなどについて説明している公式のpython HOWTOの形の優れたバックグラウンドリーダーもあります。オン:http : //docs.python.org/howto/webservers.html


2
:URLは、私は、この更新されたものと考え、古くなっdocs.python.org/2.7/howto/webservers.html
Stefaan

すばらしい資料:)この公式紹介と承認された回答を読む必要があります。
リック

4

これはPythonの単純な抽象化レイヤーであり、Javaのサーブレット仕様に似ています。CGIは実際には低レベルであり、プロセス環境と標準入出力にデータをダンプするだけですが、上記の2つの仕様は、HTTP要求と応答を言語の構成要素としてモデル化しています。しかし、私の印象では、Pythonの人々は事実上の実装に完全に定住していないため、リファレンス実装と、WSGIサポートと一緒に他のものを提供する他のユーティリティタイプライブラリ(Pasteなど)が混在していると思います。もちろん、私は間違っている可能性があります。私はPythonの初心者です。「ウェブスクリプティング」コミュニティは別の方向から問題に直面しています(共有ホスティング、CGIレガシー、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.