2012-07-09 37 views
6

Tôi có ứng dụng Django 1.4 trên máy chủ Centos 6.2 (chạy apache, mysql, php) bằng cách sử dụng mod_wsgi với dự án của tôi được triển khai trong một ảo env. Bản thân ứng dụng là một ứng dụng mà tôi đã sử dụng trong một vài năm trên một dịch vụ được lưu trữ và bây giờ tôi đang triển khai trên máy chủ điện toán đám mây rackspace của riêng tôi. Phiên bản chính xác của ứng dụng đang chạy tốt ở nơi khác, vì vậy vấn đề này là về cách tôi đã triển khai nó. Đó là triển khai python/django đầu tiên của tôi - Tôi đã thiết lập hàng chục trang web LAMP trước đây, vì vậy đó là sự thiếu hiểu biết của tôi với việc triển khai Django rõ ràng đang giữ tôi quay lại.Django/mod_wsgi OSError: [Errno 13] Quyền bị từ chối: 'tĩnh' khi DEBUG = OFF

Ứng dụng hoạt động tốt trên máy chủ của tôi với DEBUG = TRUE trong tệp settings.py của dự án, nhưng khi tôi thay đổi thành FALSE, mặt trước của trang web sẽ tạo lỗi [500] Lỗi máy chủ nội bộ.

Tôi biết rằng với DEBUG được đặt thành TẮT, apache hiện đang phân phối tệp tĩnh của tôi qua mod_wsgi (mod_wsgi đang hoạt động tốt), điều này khiến tôi tin 'điều gì đó' trong cấu hình của tôi đang ngăn chặn điều này. Tôi đã chạy lệnh ./manage.py collectstatic đã điền vào thư mục /static trong thư mục /myproject.

Tôi đã làm việc này trong nhiều tuần nay, đọc nhiều hướng dẫn triển khai như tôi có thể tìm thấy, nhưng cho đến nay không có niềm vui. Hỗ trợ của bạn sẽ được đánh giá rất nhiều.

Dưới đây là tờ khai liên quan trong hồ settings.py của dự án của tôi:

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

Và đây là 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() 

khai máy chủ ảo của tôi trong httpd.conf trông giống như này:

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

tập tin .bashrc của tôi trong/ROOT trông như thế này:

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

Và cuối cùng, error_log của tôi cho thấy 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

cách thô lỗ: [chmod -R 777/opt/virtual/myproject/static /] – pinkdawn

+1

Bạn cần tạo thư mục tĩnh có thể ghi cho người dùng theo đó Django chạy. –

+0

Thư mục của bạn nên có thể truy cập/ghi được bởi người dùng theo đó Apache chạy, hầu hết đều thích www-data – Rohan

Trả lời

7

tôi đã nhận được báo lỗi tương tự như bạn dưới những điều kiện gần như tương tự (Tôi đã chạy Ubuntu, không phải CentOS).

Khi bạn nhận thấy, khi chạy với DEBUG = FALSE, thực ra bạn đang chạy qua wsgi. Điều này có nghĩa là khi chạy với DEBUG = TRUE, bạn thực sự đang sử dụng các đặc quyền của người dùng, trong khi khi chạy với DEBUG = FALSE, bạn đang chạy sử dụng các đặc quyền của người dùng Apache. Người dùng mà Apache sử dụng là www-data.

www-data không phải là chủ sở hữu cũng không thuộc nhóm người dùng sở hữu /var/www. Điều này có nghĩa là www-data được coi là other và có các quyền được đặt cho người khác.

Các giải pháp BAD này sẽ được thực hiện:

sudo chmod -R 777 /var/www/ 

này sẽ cung cấp cho tất cả mọi người truy cập vào tất cả mọi thứ trong /var/www/, mà rõ ràng là một ý kiến ​​tồi.

Một giải pháp BAD sẽ làm:

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

Điều này sẽ thay đổi chủ sở hữu để www-data, mở ra lỗ hổng bảo mật.

Các giải pháp TỐT sẽ là:

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

này cho biết thêm www-data vào nhóm varwwwusers, sau đó được thiết lập như là nhóm cho /var/www/ và tất cả các thư mục con của nó. chmod sẽ cho phép đọc, ghi, thực thi quyền đối với chủ sở hữu và nhóm, đồng thời chặn bất kỳ người dùng nào khác truy cập vào nó.

+0

Không nên là '' 'sudo usermod -a -G varwwwusers www-data''' thay vì' '' sudo adduser www-data varwwwusers''' trong giải pháp ** GOOD **? – maciek

Các vấn đề liên quan