在 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?

分析在 Mod_wsgi 上运行的 Python 脚本

使用 apache2 在 mod_wsgi 上运行 django python 3.4

如何在Ubuntu中将mod_wsgi安装到特定的python版本?

Mac OS X Snow Leopard 上的 MOD_WSGI 困难