/ / wdrażanie aplikacji WSGI na mod_python - python, mod-wsgi, mod-python, mod-fastcgi

wdrażanie aplikacji WSGI na mod_python - python, mod-wsgi, mod-python, mod-fastcgi

Napisałem aplikację WSGI, którą muszę wdrożyć na serwerze, ale otrzymałem serwer, na którym jest już zainstalowany mod_python.

Nie wolno mi usuwać mod_python, ponieważ jest już uruchomionych kilka aplikacji mod_python.

Jedną z rozważanych przeze mnie opcji było zainstalowanie mod_wsgi obok mod_python, jednak przeszedłem przez źródła i stwierdziłem, że to zły pomysł. Najwyraźniej mod_wsgi i mod_python nie mieszają się dobrze.

Inną rozważaną przeze mnie opcją było zainstalowanie mod_fastcgi i wdrożenie go przy użyciu fastcgi.

Chciałbym usłyszeć, czy ktoś ma lepszy pomysł, który nie łamie obecnych aplikacji mod_python działających na serwerze.

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz używać mod_python i mod_wsgi razem, o ile ta sama wersja Pythona i mod_python nie są połączone ze statyczną biblioteką Pythona.

Uruchom komendę „ldd” w pliku mod_python.so:

ldd mod_python.so

aby dowiedzieć się, czy łączy się z libpythonX.Y.so. Zbuduj mod_wsgi, aby używać tej samej wersji Pythona, upewniając się, że jest podobnie połączony z tym samym libpythonX.Y.so.


AKTUALIZACJA

Wersja 4.X z mod_wsgi teraz wyraźnie odmawia uruchomienia, jeśli ładowany jest także mod_python. Aby mod_python i mod_wsgi mogły być używane razem, niektóre funkcje mod_wsgi musiały zostać sparaliżowane. Ponieważ mod_python jest teraz bardzo stary, nie jest sensownie aktualizowany, ma z nim różne problemy i nie powinien być używany do niczego nowego, nie próbuje już obsługiwać go razem.


2 dla odpowiedzi nr 2

Oto pomysł (który wymaga udoskonalenia, a który może nie zadziała):

  • To używa wsgiref.handlers.BaseHandler
  • wsgiref jest częścią standardowej biblioteki
  • Od wsgiref „s docs:” Przed próbą utworzenia dostosowanej podklasy BaseHandler należy zapoznać się z dokumentacją i kodem źródłowym, aby uzyskać dodatkowe informacje. ”
  • (poniższy kod to moduły obsługi mod_python, BTW)

Zacznę od:

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 (ładny hackish):

W swoim kodzie obsługi możesz również użyć werkzeug moduł testowy wsgi aby przekazać żądanie do aplikacji WSGI, pobierz odpowiedź werkzeug, a następnie napisz tę odpowiedź do apache.

Coś jak:

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

0 dla odpowiedzi № 3

Najlepszym rozwiązaniem może być użycie mod_proxy i uruchomienie aplikacji internetowej Python na innym serwerze WWW.


0 dla odpowiedzi nr 4

Po pewnym googlu znalazłem to:

Jak skonfigurować mod_python do użycia jako serwer WSGI

Teraz działa z Apache2, zmpm_winnt i prefork! Inne wersje i MPM mogą dać radykalnie różne wyniki masz trochę czasu i doświadczenia, spróbuj tego najnowszego wersja z prekursorem na Linuksie i innymi modułami wieloprocesorowymi ty faworyzujesz.