развертывание приложения WSGI на mod_python - PullRequest
5 голосов
/ 25 октября 2011

Я написал приложение WSGI, которое нужно развернуть на сервере, однако мне дали сервер, на котором уже установлен mod_python.

Мне не разрешено удалять mod_python, так как есть некоторые приложения mod_pythonуже запущен на нем.

Один из вариантов, который я рассмотрел, заключался в установке mod_wsgi вместе с mod_python, однако я просмотрел источники и обнаружил, что это плохая идея.Очевидно, что mod_wsgi и mod_python не очень хорошо сочетаются.

Другой вариант, который я рассмотрел, это установка mod_fastcgi и его развертывание с использованием fastcgi.

Я хотел бы услышать, если у кого-то есть идея получше, которая не имеетсломать текущие приложения mod_python, работающие на сервере.

Ответы [ 4 ]

3 голосов
/ 25 октября 2011

Вы можете использовать mod_python и mod_wsgi вместе, если одна и та же версия Python и mod_python не связаны со статической библиотекой Python.

Запустите команду 'ldd' в файле mod_python.so:

ldd mod_python.so

чтобы узнать, ссылается ли он на libpythonX.Y.so.Создайте mod_wsgi для использования той же версии Python, убедившись, что он аналогично связан с той же самой libpythonX.Y.so.


UPDATE

Версия 4.X для mod_wsgi теперь явно отказывается запускаться, если mod_pythonтакже загружен.Для того, чтобы mod_python и mod_wsgi использовались вместе, некоторые функции mod_wsgi должны были быть повреждены.Поскольку mod_python сейчас очень старый, не имеет значительного обновления, имеет различные проблемы с ним и не должен использоваться для чего-то нового, больше не пытаясь поддерживать их совместное использование.

2 голосов
/ 25 октября 2011

Вот идея (которая нуждается в уточнении, и которая, возможно, не будет работать):

  • Используется wsgiref.handlers.BaseHandler
  • wsgiref является частью стандартной библиотеки
  • Из документации wsgiref: «Вам следует обратиться к строкам документации и исходному коду для получения дополнительной информации, прежде чем пытаться создать настроенный подкласс BaseHandler.»
  • (код ниже модули-обработчики mod_python , BTW)

Вот с чего я бы начал:

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 (довольно хакерская):

Вы могли бы также использовать в своем коде обработчика модуль тестирования wsgi werkzeug , чтобы передать запрос приложению 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
1 голос
/ 25 октября 2011

Лучшим решением может быть использование mod_proxy и запуск веб-приложения Python на другом веб-сервере.

0 голосов
/ 25 октября 2011

После некоторого поиска в Google я нашел это:

Как настроить mod_python для использования в качестве сервера WSGI

Следующее теперь работает с использованием Apache2, с mpm_winnt и prefork!Другие версии и MPM могут дать совершенно другие результаты.Если у вас есть немного времени и опыта, попробуйте эту последнюю версию с prefork для Linux и любыми другими модулями мультипроцессинга, которые вы предпочитаете.

...