在ubuntu 17上通过wsgi运行django应用程序的麻烦

时间:2018-04-08 20:57:18

标签: python django apache mod-wsgi wsgi

我需要你的帮助。 我试图在wsgi我的django项目上运行时出错。 我正在使用Ubuntu 17,Apache2,Django 2.0,Python 3.6

当我从manage.py运行时,一切正常,但是当wsgi遇到下一个错误时:

  

AH01276:无法提供目录/ var / cardsite / cardsite /:无匹配   的DirectoryIndex   (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm)找到了,   和Options指令禁止的服务器生成的目录索引

并且不知道为什么,因为我猜想一切都正确。 Bellow我的配置:

的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。权限我已经给了文件夹和所有内容。 P.S.S.通过pip3安装的软件包如“libapache2-mod-wsgi-py3”或“mod-wsgi”。

谢谢大家提出的任何建议

1 个答案:

答案 0 :(得分:2)

不要将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处理。