2011-01-26 36 views
12

Tôi đang sử dụng Ubuntu 10.04.
tôi tạo một dự án django dưới /home/wong2/Code/python/django2/ tên atest
và tạo ra một tập tin wsgi setting.wsgi trong cùng một thư mục
Dưới đây là nội dung của setting.wsgi:Lỗi Apache mod_wsgi: Bị cấm Bạn không có quyền truy cập/trên máy chủ này

import os 
import sys 

path = '/home/wong2/Code/python/django2' 

if path not in sys.path: 
    sys.path.append(path) 
os.environ["DJANGO_SETTINGS_MODULE"] = "atest.settings" 
from django.core.handlers.wsgi import WSGIHandler 
application = WSGIHandler() 

và đây là những gì tôi thêm vào httpd của tôi của tôi. conf:

<VirtualHost *:80> 
    ServerName localhost 
    WSGIScriptAlias//home/wong2/Code/python/django2/setting.wsgi 
    <Directory /> 
     Options FollowSymLinks 
     AllowOverride None 
     Order deny,allow 
     Allow from all 
    </Directory> 
    <Directory "/home/wong2/Code/python/django2/atest"> 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

vấn đề là, khi tôi ghé thăm http://localhost, nó nói

Forbidden

You don't have permission to access/ on this server.

Cảm ơn rất nhiều.

+1

Di rằng phần thư mục đầu tiên - bạn không cần đến nó, và tôi nghĩ rằng đó là cách ghi đè các WSGIAlias. –

Trả lời

13

Khối thư mục thứ hai không khớp với nơi bạn đã cài đặt tệp tập lệnh WSGI. Mặc dù vậy, thực hành rất tồi tệ là gắn bó tệp kịch bản WSGI vào một vị trí nơi mã nguồn hoặc các tệp nhạy cảm khác tồn tại, ví dụ, cùng thư mục hoặc thư mục phụ. Thay vào đó bạn nên dán nó vào một thư mục con của riêng nó. Do đó:

WSGIScriptAlias//home/wong2/Code/python/django2/atest/apache/setting.wsgi 
<Directory "/home/wong2/Code/python/django2/atest/apache"> 
    Order allow,deny 
    Allow from all 
</Directory> 

Vì vậy, hãy tạo thư mục con 'apache' dưới 'atest'. Di chuyển 'setting.wsgi' vào thư mục con 'apache' đó và thay đổi cấu hình ở trên.

Sự cố của bạn cũng có thể do các điều khoản hạn chế trên thư mục chính của bạn vì Apache không thể nhìn thấy bên trong.

Go xem:

http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6#Conference_Presentations

vì nó giải thích những vấn đề quyền cũng như các vấn đề như nơi để dính mã của bạn và các tập tin WSGI kịch bản.

Cũng đọc:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

0

thử http://localhost/index.html có hiển thị trang apache không?

Nếu bạn wsgi được định cấu hình trên root chính xác, nó sẽ không.

Bạn nhận được thông báo lỗi bởi vì bạn có thể yêu cầu máy chủ web cho các danh sách thư mục của thư mục www

chỉnh sửa:

dự án của tôi là luôn luôn trong

/var/pyproj // pysrc/ và các tệp máy chủ tôi đặt trong /var/py_proj // server/

Đây là lần đầu tiên tôi chuyển đến tập lệnh wsgi

import os, sys 

import logging 
logger =logging.getLogger("") 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(levelname)-8s %(messages)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 

sys.stdout = sys.stderr 
from os.path import abspath, dirname, join 
import site 

PROJECT_ROOT = abspath(join(dirname(__file__), "../pysrc")) 
SETTINGS_LOC = abspath(join(PROJECT_ROOT, '')) 
site.addsitedir(SETTINGS_LOC) 
os.environ["DJANGO_SETTINGS_MODULE"] = "settings" 

from django.core.management import setup_environ 
import settings 
setup_environ(settings) 

sys.path.insert(0, join(PROJECT_ROOT, "apps")) 

from django.core.handlers.wsgi import WSGIHandler 

application = WSGIHandler() 

và tôi sử dụng một vhost.conf

WSGIDaemonProcess pinax_demo user=www-data group=www-data threads=10 python-path=/var/.virtualenvs/pinax_demo/lib/python2.6/site-packages 

<Directory /var/py_proj/pinax_demo/server/> 
    Order deny,allow 
    Allow from all 
</Directory> 

Alias /pinax_demo /var/py_proj/pinax_demo/server/pinax_demo.wsgi 
<Location /pinax_demo/> 
    #WSGIProcessGroup must match the WSGIDaemonProcess 
    WSGIProcessGroup pinax_demo 
    SetHandler wsgi-script 
    Options +ExecCGI 
</Location> 

mà tôi bao gồm trong thư mục sites-available trong một tập tin mà trông giống như

<VirtualHost *:8080> 
     DocumentRoot /var/www/ 

     <Directory /var/www/> 
       Order deny,allow 
       Allow from all 
       Options -Indexes FollowSymLinks 
       DirectoryIndex index.php 
       AllowOverride None 
     </Directory> 

     ServerAdmin [email protected] 

     LogLevel error 
     ErrorLog /var/srv_logs/apache_error.log 
     CustomLog /var/srv_logs/apache_access.log combined 
     #insert 
     Include /var/py_proj/pinax_demo/server/vhost.conf 
     Include /var/py_proj/<other>/server/vhost.conf 
     Include /var/py_proj/<other>/server/vhost.conf 

</VirtualHost> 

httpd.conf này là trống. Apache cũng là khủng khiếp trong việc gửi các tập tin tĩnh vì vậy tôi có thiết lập apache của tôi trên cổng 8080 và nginx thiết lập trên cổng 80 mà chuyển tiếp đến apache. Bạn có thể chỉ cần thay đổi cổng trên tệp có sẵn trên trang web của tôi để chạy mà không có nginx nhưng tôi sẽ không phát trực tiếp theo cách đó

+0

Khi tôi truy cập http: //localhost/index.html, nó vẫn hiển thị lỗi '403 Forbidden' – wong2

+0

Suy nghĩ thứ hai, Sự cố của bạn có thể chỉ là vấn đề về quyền. Nếu www-data (linux apache user) không thể đọc thư mục chủ của bạn có thể ném lỗi đó. – Plahcinski

5

tôi đã cùng một vấn đề do quyền tập tin bị hạn chế.

Theo mặc định sử dụng thư mục nhà của bạn có cài đặt:

ls -l /home/ 

drwx------ 36 user user 12288 Nov 28 20:56 user

nghĩa rằng không ai khác ngoài bản thân là đền đáp khi duyệt thư mục đó.

Thêm thực hiện tùy chọn vào thư mục cố định vấn đề của tôi

chmod o+x /home/user/ 
ls -l /home/ 

drwx-----x 36 user user 12288 Nov 28 20:56 user

-1

Bạn có thể nhận được một bất ngờ nơi WSGI của bạn có thư mục home của nó! Ngày cài đặt wsgi_mod thừa nhận ngây thơ của tôi, nó là/- Tôi rất ngạc nhiên tôi đã phải viết kịch bản này để đảm bảo:

import os 

def application(environ, start_response): 
    status = '200 OK'; e=os.listdir(os.getcwd()) 
    output = '''WSGI %s<hr>'''%(e) 
    response_headers = [('Content-type', 'text/html'), 
         ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 
    return [output] 

Điều đó có nghĩa các ứng dụng nhập khẩu sẽ cần một đường dẫn đầy đủ để được tìm thấy, ví dụ:

sys.path.append('/home/foo/www/Forms') 
from DataCommon import page 

Đây là đề xuất (bởi Google) cách tiếp cận này:

import sys; path='/home/foo/www/Forms'; 
if path not in sys.path: sys.path.append(path) 
8

với Django 1.5 + bạn nên sử dụng cách đề nghị được mô tả trong tài liệu hướng dẫn:

WSGIScriptAlias//path/to/mysite.com/mysite/wsgi.py 
WSGIPythonPath /path/to/mysite.com 

<Directory /path/to/mysite.com/mysite> 
<Files wsgi.py> 
Require all granted 
</Files> 
</Directory> 

https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/modwsgi/

+0

Tôi đã thêm '' và nó đã hoạt động! – Renato

+0

Tương tự ở đây. Đã thêm . Cảm ơn rất nhiều. – Yathi

+0

FYI - 'Yêu cầu tất cả các cấp' sẽ chỉ hoạt động trên Apache 2.4.x và dựa trên' httpd.conf' của OP nó _seems_ anh ta đang sử dụng 2.2.x hoặc ít nhất là cú pháp như vậy. Điều đó nói rằng, câu trả lời tốt! – Drewness

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