我编写了一个WSGI应用程序,我需要将其部署到服务器,但是我已经获得了一个已经安装了mod_python的服务器。
我不允许删除mod_python,因为已经有一些mod_python应用程序在运行。
我考虑过的一个选项是将mod_wsgi与mod_python一起安装,但是我查看了源代码并发现这是一个坏主意。显然mod_wsgi和mod_python混合不好。
我考虑的另一个选择是安装mod_fastcgi并使用fastcgi进行部署。
我很想听听有人有更好的想法,不会破坏服务器上运行的当前mod_python应用程序。
答案 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版本,以及任何其他多处理模块 你喜欢。