Apache mod_wsgi error: Forbidden У вас нет прав для доступа / на этом сервере - PullRequest
14 голосов
/ 26 января 2011

Я использую Ubuntu 10.04.
Я создаю проект Django под /home/wong2/Code/python/django2/ с именем atest
и создайте файл wsgi setting.wsgi в том же каталоге
Вот содержание setting.wsgi:

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()

и вот что я добавляю в свой httpd.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>

Проблема в том, что когда я посещаю http://localhost,, там написано

Запрещено

У вас нет разрешения на доступ / на этом сервере.

Большое спасибо.

Ответы [ 5 ]

17 голосов
/ 26 января 2011

Второй блок каталога не совпадает с тем, где у вас установлен файл сценария WSGI.Однако это очень плохая практика - хранить файл сценария WSGI в месте, где существует исходный код или другие конфиденциальные файлы, т. Е. В том же каталоге или подкаталоге.Вместо этого вы должны вставить его в отдельный подкаталог.Таким образом:

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>

Итак, создайте подкаталог 'apache' в 'atest'.Переместите «setting.wsgi» в этот подкаталог «apache» и измените конфигурацию на указанную выше.

Ваша проблема также может быть вызвана ограничительными разрешениями для вашего домашнего каталога, поскольку Apache не может видеть внутри.смотрите:

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

, поскольку он объясняет эти проблемы с разрешениями, а также такие вопросы, как место, где можно вставить свой код и файл сценария WSGI.*

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

9 голосов
/ 17 сентября 2014

С Django 1.5+ вы должны использовать предложенный способ, описанный в документации:

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/

6 голосов
/ 29 ноября 2012

У меня была такая же проблема из-за ограниченных прав доступа к файлу.

По умолчанию пользователь вашей домашней папки имеет настройки:

ls -l /home/

drwx ------ 36 пользователь user 12288 28 ноября 20:56 user

означает, что никто, кроме вас, не может даже просмотреть эту папку.

Добавление опции выполнения в папку исправило мою проблему

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

drwx ----- x 36 пользователь user 12288 28 ноября 20:56 user

0 голосов
/ 22 февраля 2013

Вы можете получить сюрприз, если у вашего WSGI есть домашний каталог! На моей по общему признанию наивной установке wsgi_mod это / - я был так удивлен, что мне пришлось написать этот скрипт, чтобы убедиться:

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]

Это означает, что импортированным приложениям потребуется полный путь, например ::1004.

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

Это рекомендуемый (Google) подход к этому:

import sys; path='/home/foo/www/Forms';
if path not in sys.path: sys.path.append(path)
0 голосов
/ 26 января 2011

try http://localhost/index.html показывает ли это страницу apache?

Если ваш wsgi настроен на root правильно, он не будет.

Вы получаете это сообщение об ошибке, потому что вы, возможно, запрашиваете у веб-сервера список каталогов папки www

редактирование:

Мои проекты всегда в

/ вар / pyproj // pysrc / и серверные файлы я положил в / Вар / py_proj // сервер /

Вот мой скрипт 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()

и я использую 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>

который я включаю в папку sites-available в файле, который выглядит следующим образом

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

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

        ServerAdmin oto@example.com

        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 пуст. Apache также ужасен при отправке статических файлов, поэтому у меня есть мои настройки apache на порту 8080 и nginx на порту 80, который перенаправляет в apache. Вы должны иметь возможность просто изменить порт в моем файле sites-avaiable, чтобы он запускался без nginx, но я бы не стал жить так

...