Ошибка Apache mod_wsgi: Запрещено У вас нет прав доступа/доступа на этом сервере
Я использую 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, он говорит
Запрещенный
У вас нет разрешения на доступ/ на этом сервере.
Большое спасибо.
Ответы
Ответ 1
Второй блок каталогов не совпадает с тем, где установлен ваш WSGI script. Это очень плохая практика, хотя вставлять файл WSGI script в место, где есть исходный код или другие важные файлы, т.е. Тот же каталог или подкаталог. Вместо этого вы должны вставлять его в свою собственную подкаталоги. Таким образом:
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 script.
Также читайте:
http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
Ответ 2
С 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/
Ответ 3
У меня была такая же проблема из-за ограниченных прав доступа к файлам.
По умолчанию пользователь вашей домашней папки имеет следующие настройки:
ls -l /home/
drwx ------ 36 пользователь Пользователь 12288 ноя 28 20:56 пользователь
означает, что никто, кроме вас, не сможет даже просмотреть эту папку.
Добавление опции выполнения в папку исправлено моя проблема
chmod o+x /home/user/
ls -l /home/
drwx ----- x 36 пользователь Пользователь 12288 ноя 28 20:56 пользователь
Ответ 4
попробуйте http://localhost/index.html показывает страницу apache?
Если вы правильно настроили wsgi на root, это не будет.
Вы получите это сообщение об ошибке, потому что вы можете попросить веб-сервер для списка каталогов в папке www
изменить
Мои проекты всегда находятся в
/вар/pyproj//pysrc/
и файлы сервера, которые я вставляю
/Вар/py_proj//сервер/
Вот мой переход к wsgi script
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>
который я включаю в папку, доступную для сайтов, в файле, который выглядит следующим образом:
<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 пуст. Apache также страшен при отправке статических файлов, поэтому у меня установлена моя установка apache на порту 8080 и настройка nginx на порт 80, который пересылает в apache. Вы должны просто изменить порт на моем сайте - доступный файл для запуска его без nginx, но я бы не стал жить так.
Ответ 5
Вы можете получить сюрприз, где ваш WSGI имеет свой домашний каталог! На моей, по общему признанию, наивной установке wsgi_mod, это было - я был так удивлен, что мне пришлось написать этот script, чтобы убедиться:
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]
Это означает, что для импортированных приложений потребуется полный путь, который можно найти, например:
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)