5

我编写了一个 WSGI 应用程序,我需要将它部署到服务器上,但是我得到了一个已经安装了 mod_python 的服务器。

我不允许删除 mod_python,因为上面已经运行了一些 mod_python 应用程序。

我考虑的一个选择是在 mod_python 旁边安装 mod_wsgi,但是我查看了源代码,发现这是一个坏主意。显然 mod_wsgi 和 mod_python 不能很好地混合。

我考虑的另一个选择是安装 mod_fastcgi 并使用 fastcgi 部署它。

我很想听听是否有人有更好的想法,它不会破坏服务器上运行的当前 mod_python 应用程序。

4

4 回答 4

3

您可以一起使用 mod_python 和 mod_wsgi,只要相同的 Python 版本和 mod_python 没有链接到静态 Python 库。

在 mod_python.so 文件上运行“ldd”命令:

ldd mod_python.so

找出它是否链接到 libpythonX.Y.so。构建 mod_wsgi 以使用相同的 Python 版本,确保它与相同的 libpythonX.Y.so 类似地链接。


更新

如果 mod_python 也被加载,mod_wsgi 版本 4.X 现在明确拒绝启动。为了使 mod_python 和 mod_wsgi 一起使用,必须削弱 mod_wsgi 的某些功能。由于 mod_python 现在已经很老了,没有进行有意义的更新,它有各种问题,不应该用于任何新的东西,不再试图支持它们一起使用。

于 2011-10-24T21:22:34.217 回答
2

这是一个想法(需要充实,可能行不通):

这是我要开始的:

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

IDEA 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

经过一番谷歌搜索,我发现了这个:

如何设置 mod_python 用作 WSGI 服务器

以下现在可以使用 Apache2、mpm_winnt 和 prefork!其他版本和 MPM 可能会给出完全不同的结果。如果您有一点时间和经验,请尝试在 Linux 上使用 prefork 的最新版本以及您喜欢的任何其他多处理模块。

于 2011-10-25T11:11:44.843 回答