Script kann mit mod_wsgi nicht schreiben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

"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.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Vllt. würdest du uns mal die genaue Fehlermeldung aus dem log zeigen...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

yup, morgen. Es ist nämlich ein virtueller Server in der Firma, da komm ich jetzt nicht dran...

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Schau doch mal nach ob das von mod_wsgi überhaupt in das environment mitkopiert wird
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Schau doch mal nach ob das von mod_wsgi überhaupt in das environment mitkopiert wird
Wie mache ich das?

Gruß, noisefloor[/quote]
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Indem du nen View schreibst der das environment am Schirm ausgibt?!
Antworten