在 Apache 上部署 Django - 目录布局
Posted
技术标签:
【中文标题】在 Apache 上部署 Django - 目录布局【英文标题】:Deploy Django on Apache - Directory layout 【发布时间】:2012-09-01 07:48:48 【问题描述】:我有一个具有以下目录结构的 Django 应用程序
/myapp/
/login/
/myapp_settings/
/subapp1/
/supapp2/
manage.py
位于myapp
目录中。
在项目的url.py
我有这样的 URL 设置:
urlpatterns = patterns('',
url(r'^subapp1/', include('subapp1.urls')),
url(r'^xhr/', include('subapp1.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^subapp2/', include('smart_selects.urls')),
# Login / logout.
url(r'^login/$', 'django.contrib.auth.views.login'),
url(r'^logout/$', 'django.contrib.auth.views.logout', 'next_page': '/subapp1/', name='auth_logout'),
url(r'^logout/(?P<next_page>.*)/$', 'django.contrib.auth.views.logout', name='auth_logout_next'),
)
在开发runserver
上部署时,所有内容都正确链接和加载。当我将整个 myapp
目录部署到 Apache 上的 Django 根目录时,我发现它没有按预期链接。
例如,如果我链接到example.com/login/
,我会得到一个 Apache 404。我认为这是因为我没有为该特定目录定义虚拟目录配置。
我在 Apache 中为我的应用程序设置了以下内容:
WSGIScriptAlias /myapp /var/www/django-projects/myapp/myapp_settings/wsgi.py
WSGIPythonPath /var/www/django-projects/myapp
Alias /media/ /var/www/django-projects/myapp/media/
Alias /static/ /var/www/django-projects/myapp/static/
<Directory /var/www/django-projects/myapp/static>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/django-projects/myapp/media>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/django-projects/myapp/myapp_settings/>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
我需要为我使用的每个 URL 模式配置别名和目录吗?如果是这样,我怎样才能重做我的 URL 模式,这样我就不需要这样做了。我不想在部署应用程序时进行所有这些额外的 Apache 配置。
编辑:我按照 Reinbach 的建议修改了我的 WSGIScriptAlias
。它现在显示为WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py
。但是,这仍然返回 404。Apache 日志中的错误显示
[Fri Sep 07 09:11:00 2012] [error] [client 192.189.x.x] File does not exist: /var/www/html/login
请注意,它正在查看 /var/www/html
(默认 Apache 根目录)而不是 /var/www/django-projects
EDIT2:我正在附加本节的 VirtualHost 块
WSGIPythonPath /var/www/django-projects/myapp
<VirtualHost sub.example.com:80>
DocumentRoot /var/www/django-projects/myapp
ServerName sub.example.com
WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py
Alias /robots.txt /var/www/django-projects/myapp/static/robots.txt
Alias /favicon.ico /var/www/django-projects/myapp/static/favicon.ico
AliasMatch ^/([^/]*\.css) /var/www/django-projects/myapp/static/css/$1
AliasMatch ^/([^/]*\.js) /var/www/django-projects/myapp/static/js/$1
AliasMatch ^/([^/]*\.png) /var/www/django-projects/myapp/static/images/$1
AliasMatch ^/([^/]*\.swf) /var/www/django-projects/myapp/static/swf/$1
Alias /media/ /var/www/django-projects/myapp/media/
Alias /static/ /var/www/django-projects/myapp/static/
<Directory /var/www/django-projects/myapp/static>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/django-projects/myapp/media>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/django-projects/myapp/myapp_settings/>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</VirtualHost>
【问题讨论】:
【参考方案1】:我相信您想要更改您的 WSGIScriptAlias,因为您目前希望处理 example.com/myapp/login
而您的示例显示您尝试使用 example.com/login
WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py
见How to use Django with Apache and mod_wsgi
【讨论】:
您需要为此应用程序定义一个虚拟主机,然后设置“DocumentRoot /var/www/django-projects/myapp”【参考方案2】:长篇大论
Allow 和 Deny 自 Apache 2.4.x 起已弃用,请改用 Require all grant(或 denied)。
长篇大论
我在尝试使用 Apache 和 mod_wsgi 设置 Django 时遇到了同样的问题。我不完全确定为什么会发生这种情况,但是当我在 httpd.conf 中注释掉以下行时
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
#<Directory />
# AllowOverride none
# Require all denied
#</Directory>
一切正常。
我不确定这是否是解决问题的正确和安全的方法,但我希望它可能会有所帮助。
P.S.我认为这不应该造成太多的安全问题,因为根目录无论如何都是别名:WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py
,但我可能已经磨损了。
P.P.S. 看起来更好的解决方案是不注释这些行,但将 Order 和 Allow 指令更改为 Require all grant。例如:
<Directory /var/www/django-projects/myapp/myapp_settings/>
<Files wsgi.py>
Require all granted
#Order deny,allow
#Allow from all
</Files>
</Directory>
但是,这只是我可以提出的试错解决方案。我不明白为什么它会起作用,但 Order 和 Allow 不起作用。
P.P.P.S 哦,现在我知道了。自 Apache 2.4.x 起,Allow 和 Deny 已被弃用。好的答案可以在here找到。
【讨论】:
以上是关于在 Apache 上部署 Django - 目录布局的主要内容,如果未能解决你的问题,请参考以下文章
[django]django 在apache2上部署静态文件如何加载
关于在 Apache + mod_python 上部署 Django 项目
在 Apache 上部署 Django 应用程序后媒体文件夹的 FileNotFoundError