Quijost
Servicios => Asistencia al cliente => Mensaje iniciado por: slothy en Julio 26, 2011, 20:10:17 pm
-
Hola,
Estoy tratando de poner en marcha un django-cms, de momento todo es correcto, salvo la escritura de ficheros. Por lo que he estado investigando, el subinterprete que lanza mod_wsgi, corre con los permisos del usuario apache, nobody, al tratar de realizar cualquier tipo de escritura, obtengo un error, salvo, si doy permisos de escritura a+x, si es un directorio fuera del DOCUMENT_ROOT, no puedo accederlo como URL ..., si está dentro de DROOT, es "escribible" públicamente...por otro lado veo que una posible solución puede ser la escritura en /tmp, pero no se que política hay al respecto, no de escritura, ni de borrado de mantenimiento, y quedan expuestos los ficheros al acceso por parte de los procesos "nobody" del resto de users de la máquina. La mayor parte de la problemática/solución viene de la configuración de apache de mod_wsgi,http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6 (http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6) ¿es posible algo en el sentido de modificar la configuración del mod_wsgi? ¿Se me está escapando alguna otra opción?
Como añadido, en el foro se apunta a un howto sobre capturar las excepciones con middleware, en concreto con Paste, pero no está instalado en el sistema, ¿se podría instalar?
Gracias
-
Este es un script pruebaescritura.wsgi de prueba, cambiad USUARIO Y DIRECTORIO_WEB por el que corresponda:
import os
import sys
import datetime
import string
import random
ruta = os.path.abspath("/home/USUARIO/tmp")
sys.path.append('/home/USUARIO/public_html/DIRECTORIO_WEB')
sys.path.append(ruta)
sys.stdout = sys.stderr
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!\n'
print >> environ['wsgi.errors'], "application debug #1"
archivo = datetime.datetime.isoformat(datetime.datetime.now(),"-") + ".txt"
try:
output += str(path) + "\n"
except Exception as e:
output += "%s \n" % e
try:
fi = open(os.path.join(path,archivo),"w")
chars = "".join( [random.choice(string.letters[:26]) for i in xrange(15)] )
fi.write(chars + "\n")
fi.close()
output += "OK! \n"
except Exception as e:
output += "%s \n" % e
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
print >> environ['wsgi.errors'], "application debug #2"
return [output]
Y aquí el correspondiente .htaccess
Options +Indexes
SetHandler wsgi-script
RewriteEngine On
RewriteCond %{REQUEST_URI} !(pruebaescritura.wsgi)
RewriteRule ^(.*)$ pruebaescritura.wsgi/$1 [L]
Si se añade el siguiente código nos dará el usuario con el que se ejecuta el script:
import pwd
output += str(pwd.getpwuid(os.getuid())[0]) + "\n"
-
En un compartido, para ejecutar WGSI debemos hacerlo con nobody. De otra forma, seria asignar un proceso WGSI por cada usuario del servidor compartido y
mantenerlo en memoria, lo que es elevado y costoso. Si tienes mayores necesidades, tal vez te conviene un VPS (http://quijost.com/vps/)
Por otro lado, acabamos de instalar Paste 1.7.5.1 en el server1 por defecto.