5

サーバーにデプロイする必要がある WSGI アプリケーションを作成しましたが、mod_python が既にインストールされているサーバーが提供されました。

いくつかの mod_python アプリケーションが既に実行されているため、mod_python を削除することはできません。

私が検討したオプションの 1 つは、mod_python と一緒に mod_wsgi をインストールすることでしたが、ソースを調べたところ、それは悪い考えであることがわかりました。どうやら mod_wsgi と mod_python はうまく混ざりません。

私が検討したもう 1 つのオプションは、mod_fastcgi をインストールし、fastcgi を使用してデプロイすることでした。

サーバーで実行されている現在の mod_python アプリケーションを壊さない、より良いアイデアを誰かが持っているかどうかを知りたいです。

4

4 に答える 4

3

同じ Python バージョンと mod_python が静的 Python ライブラリにリンクされていない限り、mod_python と mod_wsgi を一緒に使用できます。

mod_python.so ファイルで「ldd」コマンドを実行します。

ldd mod_python.so

libpythonX.Y.so にリンクしているかどうかを調べます。mod_wsgi をビルドして同じ Python バージョンを使用し、同じ libpythonX.Y.so に対して同様にリンクされるようにします。


アップデート

mod_wsgi のバージョン 4.X は、mod_python も読み込まれている場合、明示的に起動を拒否するようになりました。mod_python と mod_wsgi を一緒に使用するには、mod_wsgi の特定の機能を無効にする必要がありました。mod_python は現在非常に古く、意味のある更新はされておらず、さまざまな問題があり、新しいものには使用しないでください。

于 2011-10-24T21:22:34.217 に答える
2

ここにアイデアがあります(具体化する必要があり、おそらくうまくいかないでしょう):

  • wsgiref.handlers.BaseHandlerを使用します
  • wsgirefは標準ライブラリの一部です
  • wsgiref のドキュメントから: 「カスタマイズされた BaseHandler サブクラスを作成する前に、追加情報についてドキュメント文字列とソース コードを調べてください。」
  • (以下のコードはmod_python handler modulesです)

これが私が始めるものです:

from mod_python import apache
from wsgiref.handlers import BaseHandler

class MyWSGIHandler(BaseHandler):
    def __init__(self, apachereq):
        BaseHandler.__init__(self)
        self.apachereq = apachereq

    def _write(self, data):
        self.apachereq.write(data)

    # override the other required methods of BaseHandler, see
    # http://docs.python.org/library/wsgiref.html#wsgiref.handlers.BaseHandler

wsgi_app = create_your_wsgi_app()

def handler(req):
    wsgi_handler = MyWSGIHandler(req)
    wsgi_handler.run(wsgi_app)
    return apache.OK

アイデア 2 (かなりハック):

ハンドラー コードでwerkzeug wsgi テスト モジュールを使用して、要求を WSGI アプリに渡し、werkzeug 応答を取得して、その応答を apache に書き込むこともできます。

何かのようなもの:

from mod_python import apache
from werkzeug.test import Client
from werkzeug.wrappers import BaseResponse

wsgi_app = create_your_wsgi_app()

def handler(req):
    c = Client(wsgi_app, BaseResponse)
    resp = c.get(somehow_get_the_url_from(req)) # or c.post if it's a POST request
    req.write(resp.data) # ... and find a way to write the headers as well
    return apache.OK
于 2011-10-24T21:08:02.990 に答える
1

最善の解決策は、mod_proxy を使用し、別の Web サーバーで Python Web アプリを実行することです。

于 2011-10-24T20:45:34.713 に答える
0

グーグルした後、私はこれを見つけました:

WSGIサーバーとして使用するためにmod_pythonを設定する方法

以下は、mpm_winntとpreforkを使用してApache2を使用して機能するようになりました。他のバージョンとMPMは、根本的に異なる結果をもたらす可能性があります。時間と経験が少しある場合は、Linux上のpreforkを備えたこの最新バージョン、およびその他のマルチプロセッシングモジュールをお試しください。

于 2011-10-25T11:11:44.843 に答える