Seite 1 von 1
Script kann mit mod_wsgi nicht schreiben
Verfasst: Dienstag 15. Dezember 2009, 16:48
von noisefloor
Hallo,
ich habe via ein Python-Skript via Bottle und mod_wsgi laufen, im Verzeichnis /var/www/mr
Das Skript soll auch Dateien in dieses Verzeichnis speichern - das funktioniert aber nicht, nur sehe ich nicht, warum...
Der entsprechende Teil der Apache-Konfiguration sieht so aus:
Code: Alles auswählen
WSGIDaemonProcess mr user=www-data group=www-data processes=1 threads=5
WSGIScriptAlias /mr /var/www/mr/adapter.wsgi
<Directory /var/www/mr>
WSGIProcessGroup mr
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
Der WSGI-Adapter so:
Code: Alles auswählen
import sys
sys.path = ['/var/www/mr/'] + sys.path
from mr import default_app
import os
os.chdir(os.path.dirname(__file__))
application = default_app()
Die Code-Zeile, die speichern soll sieht so aus:
Code: Alles auswählen
graph = urllib.urlretrieve(strip_html(daten['vv']),'graph.png')
Alle Skript-Teile (=Routen in Bottle), die nur irgendwas returnen und nicht Schreiben wollen funktionieren 1A.
Der Fehler, der ausgegeben wird ist eine IOError 110 No Socket connection (oder so ähnlich).
Besitzer und Gruppe für das Verzeichnis /var/www/mr ist www-data.
Das System ist Ubuntu 8.04 mit Apache2, Python V2.5.x und mod_wsgi aus den offiziellen Paketquellen.
Gruß, noisefloor
Verfasst: Dienstag 15. Dezember 2009, 17:19
von nemomuk
Darf denn der ww-data User auch in dem Verzeichnis schreiben? Es ist sowieso vorteilhaft, wenn man den Prozess direkt unter einem eigenen Benutzer laufen lässt.
Verfasst: Dienstag 15. Dezember 2009, 20:40
von noisefloor
Hallo,
Das Verzeichnis steht im Moment auf "777" - also ja.
Wie meinst du das mit dem Benutzer? Z.B. einen Nutzer "mr" im System anlegen und als WSGI-User mr und als WSGI-Group mr angeben?
BTW: das ganze läuft bei exakter identischer Installation (glaube ich zumindest...) auf eine Ubuntu 8.04 Dektop-System ohne gezicke... Das Problem habe ich auf dem Server.
Gruß, noisefloor
Verfasst: Dienstag 15. Dezember 2009, 20:52
von Defnull
"IOError 110 No Socket connection" lässt eher auf einen Fehler mit urllib.urlretrieve() schließen. Schau da mal nach.
Mit bottle.debug(True) bekommst du übrigens nen Stacktrace.
Verfasst: Dienstag 15. Dezember 2009, 20:57
von noisefloor
Hallo,
Mit bottle.debug(True) bekommst du übrigens nen Stacktrace.
Ich weiß.

Ist auch aktiviert, daher weiß ich auch, dass es ein Schreibproblem gibt.
Wenn ich im Python-Interpreter
Code: Alles auswählen
urllib.urlretrieve(url_zum_bild, 'home/noisefloor/bild.png')
mache funktioniert das. Es funktioniert halt nicht im Kontext des Skript...
Gruß, noisefloor
Verfasst: Dienstag 15. Dezember 2009, 21:00
von noisefloor
Hallo,
@defnull: noch was. Exakt (!) der gleiche Code läuft 1A, inkl. speichern, wenn ich Bottle mit dem eingebauten Server bottle.run() nutze. Dann läuft das Skript aber mit meinen Rechten und speichert in mein Home-Verzeichnis.
Gruß, noisefloor
Verfasst: Dienstag 15. Dezember 2009, 21:42
von nemomuk
Vllt. würdest du uns mal die genaue Fehlermeldung aus dem log zeigen...
Verfasst: Dienstag 15. Dezember 2009, 21:46
von noisefloor
Hallo,
yup, morgen. Es ist nämlich ein virtueller Server in der Firma, da komm ich jetzt nicht dran...
Gruß, noisefloor
Verfasst: Mittwoch 16. Dezember 2009, 08:28
von noisefloor
Hallo,
die Fehlermeldung ist:
Code: Alles auswählen
Error 500: Internal Server Error
Sorry, the requested URL /sug/aushang/05-2009 caused an error:
Unhandled Exception: IOError('socket error', error(110, 'Connection timed out'))
Traceback:
Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/bottle-0.6.4-py2.5.egg/bottle.py", line 309, in __call__
output = handler(**args)
File "/var/www/mr/mr.py", line 296, in sug_aushang
ergebnis = mr_aushang.sug(datum[0],datum[1])
File "/var/www/mr/mr_aushang.py", line 83, in sug
graph = urllib.urlretrieve(strip_html(daten['vv']))
File "/usr/lib/python2.5/urllib.py", line 89, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "/usr/lib/python2.5/urllib.py", line 222, in retrieve
fp = self.open(url, data)
File "/usr/lib/python2.5/urllib.py", line 190, in open
return getattr(self, name)(url)
File "/usr/lib/python2.5/urllib.py", line 325, in open_http
h.endheaders()
File "/usr/lib/python2.5/httplib.py", line 860, in endheaders
self._send_output()
File "/usr/lib/python2.5/httplib.py", line 732, in _send_output
self.send(msg)
File "/usr/lib/python2.5/httplib.py", line 699, in send
self.connect()
IOError: [Errno socket error] (110, 'Connection timed out')
defnull hat scheinbar Recht: es ist ein Problem von urlretrieve. Wenn ich die Zeile mit urlib.urlretrieve auskommentiere kann das Skript ohne weiteres in das Verzeichnis schreiben (in diesem Fall wird ein PDF mit ReportLab generiert).
Wenn ich einen interaktiven Python-Intrepreter auf dem Server starte und den Befehl von Hand dort eingebe funtkioniert es auch ohne Probleme. Von daher sollte es auch kein Problem mit dem Proxy sein...
Gruß, noisefloor
Verfasst: Mittwoch 16. Dezember 2009, 14:22
von noisefloor
Hallo,
so, Problem gelöst.
Es lag doch am Proxy. Wenn ich urllib.urlopen(url,proxy) benutze, dann geht es 1A.
Was sich mir nur nicht erschließt ist, warum das Skript bzw. der Nutzer www-data die globale Environment-Variable http_proxy ignoriert...
Gruß, noisefloor
Verfasst: Donnerstag 17. Dezember 2009, 15:04
von apollo13
Schau doch mal nach ob das von mod_wsgi überhaupt in das environment mitkopiert wird
Verfasst: Donnerstag 17. Dezember 2009, 20:36
von noisefloor
Hallo,
Schau doch mal nach ob das von mod_wsgi überhaupt in das environment mitkopiert wird
Wie mache ich das?
Gruß, noisefloor[/quote]
Verfasst: Freitag 18. Dezember 2009, 14:42
von apollo13
Indem du nen View schreibst der das environment am Schirm ausgibt?!