Tengo una aplicación Django 1.4 en un servidor Centos 6.2 (ejecutando apache, mysql, php) usando mod_wsgi con mi proyecto implementado en un virtual env. La aplicación en sí es una que he estado utilizando durante varios años en un servicio alojado y ahora estoy implementando en mi propio servidor en la nube Rackspace. La versión exacta de la aplicación se está ejecutando correctamente en otro lugar, por lo que este problema se trata de cómo lo he implementado. Es mi primer despliegue de python/django. He configurado docenas de sitios LAMP previamente, por lo que es mi falta de familiaridad con las implementaciones de Django lo que claramente me frena.Django/mod_wsgi OSError: [Errno 13] Permiso denegado: 'estático' cuando DEBUG = OFF
La aplicación funciona bien en mi servidor con DEBUG = TRUE
en el archivo settings.py del proyecto, pero cuando cambio esto a FALSE, el front-end del sitio produce [500] Errores internos del servidor.
Soy consciente de que con DEBUG desactivado, apache ahora está publicando mis archivos estáticos a través de mod_wsgi (mod_wsgi funciona bien), lo que me lleva a pensar que "algo" en mi configuración lo impide. He ejecutado el comando ./manage.py collectstatic
que llenó el directorio /static
en la carpeta /myproject
.
He estado trabajando en esto durante semanas, leyendo todas las guías de implementación que he podido encontrar, pero hasta ahora no me ha gustado. Su ayuda sería muy apreciada.
Estas son las declaraciones pertinentes de archivo settings.py de mi proyecto:
############ settings.py #############
SITE_ROOT = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = '/opt/virtual/myproject/static/localtv/media/'
MEDIA_URL = 'http://example.org/static/localtv/media/'
STATIC_ROOT = '/opt/virtual/myproject/static/'
STATIC_URL = 'http://example.org/static/'
Y aquí está el archivo wsgi.py:
############# wsgi.py #################
import os
import sys
import site
site.addsitedir('/opt/virtual/myapp/lib/python2.7/site-packages')
apache_configuration= os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
sys.path.append('/opt/virtual')
sys.path.append('/opt/virtual/myproject')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Mi declaración host virtual en httpd.conf parece esto:
############ virtual host declaration in httpd.conf ##############
<VirtualHost *:80>
ServerName example.org
ServerAlias www.example.org
DocumentRoot /opt/virtual/myproject
Alias /robots.txt /opt/virtual/myproject/static/robots.txt
Alias /favicon.ico /opt/virtual/myproject/static/favicon.ico
AliasMatch ^/([^/]*\.css) /opt/virtual/myproject/static/styles/$1
Alias /static/ /opt/virtual/myproject/static/
Alias /media/ /opt/virtual/myproject/static/media
Alias /images /opt/virtual/myproject/static/images
<Directory /opt/virtual/myproject/static>
Order deny,allow
Allow from all
</Directory>
<Directory /opt/virtual/myproject/static/media>
Order deny,allow
Allow from all
</Directory>
WSGIDaemonProcess example.org python-path=/opt/virtual/myapp/lib/python2.7/site-packages
WSGIProcessGroup example.org
WSGIScriptAlias//opt/virtual/myproject/application/wsgi.py
<Directory /opt/virtual/myproject>
<Files wsgi.py>
Order allow,deny
Allow from all
</Files>
</Directory>
Mi archivo .bashrc en/ROOT se parece a esto:
########### .bashrC##################
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
alias python='/opt/bin/python2.7'
export PYTHONPATH=/opt/virtual/myapp/lib/python2.7/site-packages:$PYTHONPATH
Y, por último, mi error_log que muestra el Rastreo:
############### error_log ###############
[Mon Jul 09 09:21:13 2012] [error] <WSGIRequest
[Mon Jul 09 09:21:13 2012] [error] path:/,
[Mon Jul 09 09:21:13 2012] [error] GET:<QueryDict: {}>,
[Mon Jul 09 09:21:13 2012] [error] POST:<QueryDict: {}>,
[Mon Jul 09 09:21:13 2012] [error] 'DOCUMENT_ROOT': '/opt/virtual/myproject',
[Mon Jul 09 09:21:13 2012] [error] 'GATEWAY_INTERFACE': 'CGI/1.1',
[Mon Jul 09 09:21:13 2012] [error] 'HTTP_ACCEPT': "*/*",
[Mon Jul 09 09:21:13 2012] [error] 'HTTP_HOST': 'example.org',
[Mon Jul 09 09:21:13 2012] [error] 'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
[Mon Jul 09 09:21:13 2012] [error] 'PATH_INFO': u'/',
[Mon Jul 09 09:21:13 2012] [error] 'PATH_TRANSLATED': '/opt/virtual/myproject/application/wsgi.py/',
[Mon Jul 09 09:21:13 2012] [error] 'QUERY_STRING': '',
[Mon Jul 09 09:21:13 2012] [error] 'REMOTE_ADDR': '99.99.99.99',
[Mon Jul 09 09:21:13 2012] [error] 'REMOTE_PORT': '99999',
[Mon Jul 09 09:21:13 2012] [error] 'REQUEST_METHOD': 'GET',
[Mon Jul 09 09:21:13 2012] [error] 'REQUEST_URI': '/',
[Mon Jul 09 09:21:13 2012] [error] 'SCRIPT_FILENAME': '/opt/virtual/myproject/application/wsgi.py',
[Mon Jul 09 09:21:13 2012] [error] 'SCRIPT_NAME': u'',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_ADDR': '111.111.111.111',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_ADMIN': '[email protected]',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_NAME': 'example.org',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_PORT': '80',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_PROTOCOL': 'HTTP/1.0',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_SIGNATURE': '<address>Apache/2.2.15 (CentOS) Server at example.org Port 80</address>\\n',
[Mon Jul 09 09:21:13 2012] [error] 'SERVER_SOFTWARE': 'Apache/2.2.15 (CentOS)',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.application_group': 'example.org|',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.callable_object': 'application',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.handler_script': '',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.input_chunked': '0',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.listener_host': '',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.listener_port': '80',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.process_group': 'example.org',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.request_handler': 'wsgi-script',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.script_reloading': '1',
[Mon Jul 09 09:21:13 2012] [error] 'mod_wsgi.version': (3, 3),
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.errors': <mod_wsgi.Log object at 0x7f34321aa530>,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0x7f34320e4e40>,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.input': <mod_wsgi.Input object at 0x7f34320e02b0>,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.multiprocess': False,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.multithread': True,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.run_once': False,
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.url_scheme': 'http',
[Mon Jul 09 09:21:13 2012] [error] 'wsgi.version': (1, 1)}>
[Mon Jul 09 09:21:13 2012] [error] -------------------------------------------------------------------------------
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] mod_wsgi (pid=21520): Exception occurred processing WSGI script '/opt/virtual/myproject/application/wsgi.py'.
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] Traceback (most recent call last):
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 241, in __call__
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] response = self.get_response(request)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/core/handlers/base.py", line 179, in get_response
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/core/handlers/base.py", line 228, in handle_uncaught_exception
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return callback(request, **param_dict)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] response = view_func(request, *args, **kwargs)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/views/defaults.py", line 33, in server_error
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return http.HttpResponseServerError(t.render(Context({})))
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 140, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self._render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return node.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return compiled_parent._render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return node.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] result = block.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] response = view_func(request, *args, **kwargs)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/views/defaults.py", line 33, in server_error
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return http.HttpResponseServerError(t.render(Context({})))
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 140, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self._render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return node.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return compiled_parent._render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return self.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return node.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] result = block.nodelist.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 823, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] bit = self.render_node(node, context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return node.render(context)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/templatetags/compress.py", line 91, in render
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] rendered_output = compressor.output(self.mode, forced=forced)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/css.py", line 53, in output
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] ret.append(subnode.output(*args, **kwargs))
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/css.py", line 55, in output
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return super(CssCompressor, self).output(*args, **kwargs)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/base.py", line 221, in output
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] finished_content = self.handle_output(mode, filtered_content, forced)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/base.py", line 233, in handle_output
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] return output_func(mode, content, forced)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/compressor/base.py", line 245, in output_file
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] self.storage.save(new_filepath, ContentFile(content))
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/core/files/storage.py", line 45, in save
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] name = self._save(name, content)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/site-packages/django/core/files/storage.py", line 168, in _save
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] os.makedirs(directory)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] File "/opt/virtual/myapp/lib/python2.7/os.py", line 157, in makedirs
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] mkdir(name, mode)
[Mon Jul 09 09:21:13 2012] [error] [client 99.99.99.99] OSError: [Errno 13] Permission denied: '/opt/virtual/myproject/static/CACHE/css'
rude way: [chmod -R 777/opt/virtual/myproject/static /] – pinkdawn
Necesita escribir el directorio estático para el usuario bajo el cual se ejecuta Django. –
Su directorio debe ser accesible/escribible por el usuario bajo el cual Apache se ejecuta, muy probablemente www-data – Rohan