我有一个测试django项目,我一直在使用django开发服务器。我想开始使用实际的apache服务器来正确模拟生产环境。我使用的是Mac OS X.
我一直在使用this tutorial here,但在第一组说明中,我从localhost获得了403。浏览器说我无权访问服务器上的/
。
当我从教程中注释掉apache配置行时,WSGIScriptAlias / /Users/username/Projects/django_books/django_books/django.wsgi
我可以访问localhost。
这是我的django.wsgi文件的内容:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_books.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
path = '/Users/username/Projects/django_books/django_books'
if path not in sys.path:
sys.path.append(path)
导致403的原因是什么,为什么我看不到我的django应用程序?
目录结构:
django_books
apache (empty directory right now)
random_book
__init__.py
models.py
views.py
django_books
__init__.py
django.wsgi
settings.py
urls.py
views.py
wsgi.py
media
static
css
style.css
manage.py
所有目录的权限:
/Users/username/Projects/django_books/django_books/django.wsgi
-rw-r--r--
/用户/用户名/项目/ django_books / django_books
drwxr-xr-x
/用户/用户名/项目/ django_books /
drwxr-xr-x
/用户/用户名/项目/
drwxr-xr-x
/用户/用户名/
drwxr-xr-x+
/用户/
drwxr-xr-x
答案 0 :(得分:1)
根据我的小经验,我认为你必须在导入系统行下方添加以下行,以便将项目放在路径上(所以在“import sys”下面的juste)就像在你引用的教程中所说的那样。另外,删除路径中的第二个“django_books”,因为你想链接到你的网站而不是你网站上的应用程序;-)(教程中的“mysite”,而不是mysite / mysite)
import os
import sys
path = '/Users/username/Projects/django_books'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_books.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
再见
答案 1 :(得分:1)
这可能是与Apache安装,python库或文件系统权限相关的问题。
你没有在你的问题中说出来,但我假设你在链接中使用的是Apache2和mod_wsgi。
您可以通过在django.wsgi的位置放置一个伪wsgi脚本来测试Apache和mod_wsgi(或您的wsgi模块)是否正常工作。这个脚本(从mod_wsgi's docs偷来的)不依赖于Django,并且有助于确保Apache可以读取和执行wsgi脚本:
# test version of django.wsgi
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
重新启动apache
sudo service apache2 restart
继续测试页面。它有用吗?大。撤消对django.wsgi脚本的更改,重新启动Apache并再次测试。如果Django网站仍然不起作用,我们需要继续寻找。如果测试脚本不起作用,则可能是Apache安装有问题。检查apache的错误日志,了解有关发生的情况的更多信息。在Linux上,它通常在/var/log/apache2/error.log
。 mod_wsgi
可能安装不正确,脚本的守护程序可能没有对wsgi文件的适当权限。
Apache可能无法读取和执行wsgi文件。如其他答案所示,在wsgi文件的目录中运行ls -l
将告诉您文件所属的用户和组(如果该用户和组可以读取,写入或执行给定文件)。默认安装通常具有wsgi权限,如下所示:
-rw------- 1 www-data www-data 1470 Aug 29 16:00 django.wsgi
如果要为守护程序进程使用其他用户,则需要确保apache conf文件定义WSGIDaemonProccess
WSGIScriptAlias / /Users/username/Projects/django_books/django_books/django.wsgi
WSGIDaemonProcess wsgi_user processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup wsgi_group
测试对这些文件的更改并重新启动Apache可以帮助缩小范围。继续检查Apache日志文件。
Django关于设置mod_wsgi的教程很好,但也可以通过mod_wsgi的wiki阅读。除WSGIScriptAlias
之外,您的apache conf文件中还有许多有用的事情需要考虑。确保有一个标签指向wsgi文件的文件夹。如果该目录中存在非公共文件(如django项目文件),请使用apache目录(更新您的apache conf文件)或在节点下添加标记以保持其他文件的私有性。当你在那里时,你可能会注意到其他看起来不对的东西,例如服务器名称不正确,多个虚拟主机或其他错误。
如果你正在使用virtualenv(do it),请确保
1. WSGIDaemonProcess
变量在变量的python-path属性中定义了相应的site-packages和wsgi脚本的位置。
2.守护程序有权读取virtualenv中的站点包。
3.您的wsgi脚本正确导入django和您网站的设置。
您可以通过向Apache conf文件添加几行来提高Apache报告的日志记录级别。此设置为您提供了部署期间可能需要的详细日志记录(确保创建日志文件夹):
LogLevel info
ErrorLog /Users/username/Projects/django_books/logs/apache_error.log
CustomLog /Users/username/Projects/django_books/logs/apache_access.log combined
答案 2 :(得分:0)
我怀疑www-data(或任何用户apache正在运行)无法访问/Users/username/Projects/django_books/django_books
。
su
给该用户并尝试访问该目录及其中的wsgi文件。
要打印所有相关权限:
ls -ld /Users /Users/username /Users/username/Projects /Users/username/Projects/django_books /Users/username/Projects/django_books/django_books /Users/username/Projects/django_books/django_books/django.wsgi
您还应该检查apache错误日志,它们可能会告诉您出了什么问题。