Unterscheiden: mod_python, fastCGI, mod_wsgi, cgi ?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Auf http://wiki.python.de/Web-Skripte%20zum ... %20bringen gibt es ein kleinen Test um zu sehen ob das script als CGI oder nicht läuft.

Ich frage mich allerdings gerade, ob man das nicht soweit aufbohren kann, das man genau zwischen mod_python, fastCGI, mod_wsgi und cgi unterscheiden kann.

Bei mod_wsgi ist es besonders einfach:

Code: Alles auswählen

if __name__.startswith('_mod_wsgi_'):
    ...
siehe: https://code.google.com/p/modwsgi/wiki/ ... r_mod_wsgi

Bei mod_python ist wohl __name__ != "__main__", aber was ist __name__ ?

Unter Linux (was wohl eh am meisten interessant ist) könnte man schauen, wer der parent-Prozess ist. Bei fast_CGI ist es z.B.: /usr/sbin/fcgi-pm

Was meint ihr, ist es möglich mit einem Skript alle Varianten zu testen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

willst du wirklich noch mod_python einbauen? Status ist ja bekannt. Gut, Prod-Server werden manchmal ein wenig später umgestellt, wegen "never touch a running system".

BTW (Achtung, Halbwissen!): Kann man zwischen WSGI und CGI nicht unterscheiden, indem man testet, ob bestimmt Environment-Variablen vorhanden sind?

Gruß, noisefloor
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, es geht. Ich hab eine Lösung gebastelt, die einige Informationen zusammen trägt: https://gist.github.com/1186632

Im Prinzip ist es das:

Code: Alles auswählen

if __name__.startswith('_mod_wsgi_'):
    # mod_wsgi

elif __name__.startswith('_mp_'):
    # mod_python

elif __name__ == "__main__": # fast_CGI or normal CGI
    if "CGI" in os.environ.get("GATEWAY_INTERFACE", ""):
        # normales CGI
    else:
        # kann dann nur fast_CGI oder was anderes sein
Die Frage ist, wie man besser fast_CGI erkennen kann und was man sonst noch unterscheiden könnte? Ideen?

Ich hab lokal mit apache2 die Varianten mod_python, fastCGI, mod_wsgi und cgi getestet. Mittels mod_rewrite und einer .htaccess, die im Prinzip so aussieht:

Code: Alles auswählen

# libapache2-mod-wsgi
#AddHandler wsgi-script .py

# Old libapache2-mod-fastcgi Apache module:
#AddHandler fastcgi-script .py

# New libapache2-mod-fcgid Apache module:
#AddHandler fcgid-script .py

# libapache2-mod-python
#AddHandler mod_python .py
#PythonHandler python_test
#PythonDebug on

# normal CGI
#AddHandler cgi-script .py

#-----------------------------------------------------------------------

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ python_test.py/$1 [QSA,L]
Jeweils ein Handler Einkommentieren und das Skript "aufrufen"...

Wenn das Skript läuft, werden einige Informationen angezeit, z.B.:
* Python Version, uname, PID, UID+Userdaten, IP und Domain
* Apachemodule (*.load Dateien in '/etc/apache2/mods-enabled')
* Das WSGI/mod_python Environment und das normale os.environ
* Alle gefunden Python Module aus sys.path (Basiert auf ein ganz altes Skript)

Es wird eine Log Datei erstellt, da kann man rein sehen, falls was nicht läuft...

EDIT: Neuste Version hier: https://github.com/jedie/python-code-sn ... n_web_test

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, hab noch mal ein wenig weiter gespielt: https://github.com/jedie/python-code-sn ... n_web_test und auch die README mit einigen Informationen versehen.

Nun kann das script selber auch als SCGI Server laufen. Irgendwie soll es auch gehen, das Apache selber den SCGI Server startet, so wie er es wohl auch bei den anderen macht. Aber ich habe keine Anleitung dafür gefunden.

Weiß jemand wie das geht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten