2012-07-09 10 views
6

Ho un'applicazione Django 1.4 su un server Centos 6.2 (con apache, mysql, php) usando mod_wsgi con il mio progetto distribuito in un virtual ENV. L'applicazione stessa è una che uso da diversi anni su un servizio in hosting e ora sto implementando sul mio cloud server rackspace. La versione esatta dell'app sta funzionando bene altrove, quindi questo problema riguarda il modo in cui l'ho distribuito. È la mia prima implementazione Python/Django: ho già configurato decine di siti LAMP, quindi è la mia mancanza di familiarità con le distribuzioni di Django che mi sta chiaramente trattenendo.Django/mod_wsgi OSError: [Errno 13] Autorizzazione negata: 'statico' quando DEBUG = OFF

L'app funziona correttamente sul mio server con DEBUG = TRUE nel file settings.py del progetto, ma quando lo cambio su FALSE il front-end del sito produce [500] Errori interni del server.

Sono consapevole che con DEBUG impostato su OFF, apache ora sta servendo i miei file statici tramite mod_wsgi (mod_wsgi sta funzionando bene), il che mi porta a credere che "qualcosa" nella mia configurazione lo stia impedendo. Ho eseguito il comando ./manage.py collectstatic che ha popolato la directory /static nella cartella /myproject.

Ho lavorato su questo per settimane, leggendo quante più guide di distribuzione che riesco a trovare, ma finora nessuna gioia. La tua assistenza sarebbe molto apprezzata.

Queste le dichiarazioni relative a file di settings.py del mio progetto:

############ 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/' 

Ed ecco il file 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() 

mia dichiarazione dell'host virtuale in httpd.conf assomiglia questo:

############ 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> 

Il mio file .bashrc in/root assomiglia a questo:

########### .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 

E, infine, il mio error_log mostra la Traceback:

############### 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' 
+0

modo scortese: [chmod -R 777/opt/virtuale/myproject/static /] – pinkdawn

+1

È necessario rendere la directory statica scrivibile per l'utente con cui viene eseguito Django. –

+0

La tua directory dovrebbe essere accessibile/scrivibile dall'utente in cui viene eseguito Apache, più probabilmente www-data – Rohan

risposta

7

ho ricevuto lo stesso errore, come si in condizioni quasi simili (Stavo usando Ubuntu, non CentOS).

Come notato, quando si esegue con DEBUG = FALSE, si sta effettivamente scorrendo attraverso wsgi. Ciò significa che quando si esegue con DEBUG = TRUE, si stanno effettivamente utilizzando i privilegi dell'utente, mentre quando si esegue con DEBUG = FALSE, si sta utilizzando i privilegi dell'utente di Apache. L'utente che Apache utilizza è www-data.

www-data non è né il proprietario né il gruppo di utenti che possiedono /var/www. Ciò significa che www-data viene considerato come other e ha le autorizzazioni impostate su altri.

Il BAD soluzione a questo sarebbe quella di fare:

sudo chmod -R 777 /var/www/ 

Questo sarebbe dare a tutti l'accesso completo a tutto in /var/www/, che è ovviamente una pessima idea.

Un'altra cattiva soluzione sarebbe quella di fare:

sudo chown -R www-data /var/www/ 

Questo cambierebbe il proprietario a www-data, che apre le vulnerabilità di sicurezza.

La buona soluzione sarebbe:

sudo groupadd varwwwusers 
sudo adduser www-data varwwwusers 
sudo chgrp -R varwwwusers /var/www/ 
sudo chmod -R 770 /var/www/ 

Questo aggiunge www-data al gruppo varwwwusers, che viene quindi impostato come gruppo per /var/www/ e tutte le relative sottocartelle. chmod fornirà permessi di lettura, scrittura, esecuzione al proprietario e al gruppo, impedendo a qualsiasi altro utente di accedervi.

+0

Non dovrebbe essere '' 'sudo usermod -a -G varwwwusers www-data''' al posto di' '' sudo adduser www-data varwwwusers''' nella soluzione ** BUONA **? – maciek

Problemi correlati