在 ubuntu 17 上通过 wsgi 运行 django 应用程序的问题
Posted
技术标签:
【中文标题】在 ubuntu 17 上通过 wsgi 运行 django 应用程序的问题【英文标题】:Troubles with running django app via wsgi on ubuntu 17 【发布时间】:2018-09-18 05:57:39 【问题描述】:我需要你的帮助。 尝试在 wsgi 我的 django 项目上运行时出现错误。 我正在使用 Ubuntu 17、Apache2、Django 2.0、Python 3.6
当我从 manage.py 运行时,一切正常,但是当通过 wsgi 得到下一个错误时:
AH01276:无法提供目录 /var/cardsite/cardsite/:无匹配 目录索引 (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) 找到, 和选项指令禁止的服务器生成的目录索引
不知道为什么,因为我猜一切都正确。波纹管我的配置:
apache.conf
<VirtualHost *:80>
CustomLog /var/log/apache2/cardsite-access.log common
ErrorLog /var/log/apache2/cardsite-error.log
DocumentRoot /var/cardsite/cardsite/
Alias /static /var/cardsite/cardsite/static/
<Directory /var/cardsite/cardsite/static>
Require all granted
</Directory>
<Directory /var/cardsite/cardsite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^(.*)$ http://www.%HTTP_HOST%REQUEST_URI [R=301,L]
WSGIDaemonProcess cardsite python-path=/var/cardsite/ python-home=/var/venv_python36/
WSGIProcessGroup cardsite
WSGIScriptAlias / /var/cardsite/cardsite/wsgi.py
</VirtualHost>
wsgi.py
import os
import sys
PROJECT_DIR = '/var/cardsite'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cardsite.settings")
def execfile(filename):
globals = dict( __file__ = filename )
exec( open(filename).read(), globals )
activate_this = os.path.join( '/var/venv_python36/bin', 'activate_this.py' )
execfile( activate_this )
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
附:我对文件夹及其里面的所有内容授予的权限。 P.S.S.还通过 pip3 安装了“libapache2-mod-wsgi-py3”或“mod-wsgi”等软件包。
谢谢大家的建议
【问题讨论】:
【参考方案1】:不要将DocumentRoot
设置为源代码的父目录。如果你把WSGIScriptAlias
拿出来,人们可以下载你的源代码。即使WSGIScriptAlias
当前拦截了/
下的所有内容,您也应该避免这种风险。 DocumentRoot
目录不允许访问也可能是问题的一部分。
试试:
<VirtualHost *:80>
CustomLog /var/log/apache2/cardsite-access.log common
ErrorLog /var/log/apache2/cardsite-error.log
DocumentRoot /var/cardsite/htdocs
<Directory /var/cardsite/htdocs>
Require all granted
</Directory>
Alias /static /var/cardsite/cardsite/static
<Directory /var/cardsite/cardsite/static>
Require all granted
</Directory>
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^(.*)$ http://www.%HTTP_HOST%REQUEST_URI [R=301,L]
WSGIDaemonProcess cardsite python-path=/var/cardsite python-home=/var/venv_python36
WSGIProcessGroup cardsite
WSGIApplicationGroup %GLOBAL
WSGIScriptAlias / /var/cardsite/cardsite/wsgi.py
<Directory /var/cardsite/cardsite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
添加WSGIApplicationGroup
一如既往是个好主意,只有一个 WSGI 应用程序委派给守护进程组。
确保创建目录:
/var/cardsite/htdocs
最后,您缺少ServerName
指令。因此,如果这不是默认的VirtualHost
,您的请求甚至可能不会被此VirtualHost
处理。
【讨论】:
非常感谢您的帮助。我做了这些更改,但不幸的是错误仍然存在.. :( 您还定义了其他VirtualHost
吗?正如我所说,如果你这样做,则不会使用这个,因为ServerName
没有设置。
也可以尝试注释掉 mod_rewrite
规则以消除它们的问题。以上是关于在 ubuntu 17 上通过 wsgi 运行 django 应用程序的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 mod_wsgi 在 Ubuntu 16.04 apache2 上部署 Django 应用程序
如何在 Ubuntu + Apache2.4 + mod_wsgi 上为 Ansible 配置 ARA?
使用 apache2 在 mod_wsgi 上运行 django python 3.4