在mod_python上部署WSGI应用程序

时间:2011-10-24 20:19:37

标签: python mod-wsgi mod-python mod-fastcgi

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

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

我考虑过的一个选项是将mod_wsgi与mod_python一起安装,但是我查看了源代码并发现这是一个坏主意。显然mod_wsgi和mod_python混合不好。

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

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

4 个答案:

答案 0 :(得分: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_python,mod_wsgi的版本4.X现在显式拒绝启动。为了使mod_python和mod_wsgi一起使用,mod_wsgi的某些功能必须被削弱。由于mod_python现在非常陈旧,没有有意义的更新,因此存在各种问题,不应该用于任何新的,不再试图支持它们一起使用。

答案 1 :(得分: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(非常hackish):

您可以在处理程序代码中使用werkzeug wsgi testing module将请求传递给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

答案 2 :(得分:1)

最好的解决方案可能是使用mod_proxy并在不同的Web服务器上运行Python Web应用程序。

答案 3 :(得分:0)

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

  

如何设置mod_python以用作WSGI服务器

     

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