带有 WSGI 的 Django 在 Apache VirtualHost 后面给出 404

Posted

技术标签:

【中文标题】带有 WSGI 的 Django 在 Apache VirtualHost 后面给出 404【英文标题】:Django with WSGI behind Apache VirtualHost gives 404 【发布时间】:2015-05-03 14:16:40 【问题描述】:

我正在尝试在 Apache 服务器上使用 WSGI 在虚拟主机中运行 Django 应用程序。

我完全遵循了 Django 文档,但这里似乎仍然存在一些问题。

据我所知,我已经正确配置了所有内容。

wsgi.py:

import os
import sys

path='/var/www/docs/'
sys.path.append(path)

os.environ["DJANGO_SETTINGS_MODULE"] = "DocsEngine.settings"

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

虚拟主机文件:

Listen 8000

WSGIPythonPath /var/www/docs

<VirtualHost *:8000>
    WSGIScriptAlias / /var/www/docs/DocsEngine/wsgi.py

    ServerName myurl.com
    Alias /resources/ /var/www/docs/resources/

    <Directory /var/www/docs/DocsEngine>
        <Files wsgi.py>
            Require all granted
        </Files> 
    </Directory>

    CustomLog /var/log/apache2/wsgi-access.log combined  
    ErrorLog  /var/log/apache2/wsgi-error.log

</VirtualHost>

当导航到myurl.com:8000/ 时,它会出现一个 404 页面。

我的防火墙打开了 8000 端口 此虚拟主机在 apache 中启用。 Apache 已启用 mod_wsgi django 应用程序在使用开发服务器在本地运行时可以正常工作。 我的本地机器和服务器都在运行 python 2.7.6 和 django 1.7.3

我能够访问位于我的/resources 目录中的东西,所以我知道 apache 可以识别其中的某些部分。

我已经为此苦苦思索了好几个小时,任何帮助将不胜感激。

【问题讨论】:

它很可能根本不会影响您的 wsgi.py 脚本。您可以通过在 WSGI 脚本中的 /tmp/test.txt 文件中添加打印某些内容的调试行来测试这一点。然后下一步是最大化 Apache 日志级别,如果脚本根本没有运行,请查看 Apache 日志中的内容。然后下一步是从已知的工作示例中做一个干净的工作配置文件并开始添加位,直到它停止工作并且您知道导致问题的原因。 如您所见,Apache + mod_wsgi 不是非常友好的调试环境,这也是开发人员转向其他解决方案的原因之一(提示:nginx + uwsgi)。 好吧,我做到了,当我请求页面时,它正在命中脚本。尽管由于文件权限,该脚本无法在其自己的目录中创建文件。也许这与它有关? 【参考方案1】:

经过大约 14 个小时的 Google-fu 和很多失败,我终于找到了解决方案。显然,他们在 Django 1.7 和 Apache 2.4 中都进行了未记录的重大更改。

首先,我需要从 Apache 禁用 mod_python。显然,当 WSGI 也被启用时,它会导致 silent 问题。一旦我禁用它,我的日志就开始爆炸,感谢上帝。这是我找到的向我描述此解决方案的链接:http://marc-abramowitz.com/archives/2012/09/28/some-tips-for-setting-up-apache-and-mod_wsgi/

鉴于禁用 mod_python 时发现的错误,我发现 Django 的 WSGI.py 文件需要以这种方式初始化,与文档中描述的不同:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

https://www.pythonanywhere.com/forums/topic/1629/#id_post_11030

希望这对将来遇到此问题的可怜人有所帮助。

【讨论】:

很好的答案!让我们希望后代能找到这个:)【参考方案2】:

请查看以下步骤: 创建新文件:

sudo nano /etc/apache2/sites-available/domain_name

将这些行写入您的新文件中。

<VirtualHost *:8000>
        ServerAdmin yogesh@cisinlabs.com
        ServerName myurl.com
        ServerAlias myurl.com
        WSGIScriptAlias / /var/www/docs/DocsEngine/wsgi.py

        Alias /static/ /home/cis/DjangoLive/cismailer/static/
        <Location "/static/">
            Options -Indexes
        </Location>
</VirtualHost>

然后运行:

sudo a2ensite domain_name

然后打开文件:

sudo nano /etc/apache2/ports.conf

更改此文件中的端口:

NameVirtualHost *:8000
Listen 8000

然后sudo service apache2 restart

希望这对你有用。

如果你使用 virtualenv,你的 wsgi 脚本文件如下所示:

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with

site.addsitedir('/path/of/your/env/lib/python2.7/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('/var/www/docs/DocsEngine')
sys.path.append('/var/www/docs/DocsEngine/DocsEngine')


# Activate your virtual env
activate_env=os.path.expanduser("/path/of/your/env/bin/activate_this.py")

execfile(activate_env, dict(__file__=activate_env))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DocsEngine.settings")


import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

以下是一些您可以使用以获取更多信息的内容: http://thecodeship.com/deployment/deploy-django-apache-virtualenv-and-mod_wsgi/

https://www.digitalocean.com/community/tutorials/how-to-run-django-with-mod_wsgi-and-apache-with-a-virtualenv-python-environment-on-a-debian-vps

【讨论】:

以上是关于带有 WSGI 的 Django 在 Apache VirtualHost 后面给出 404的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 3.6、Apache 2.4 和 Django 1.11 在 Ubuntu 上安装 mod_wsgi

Apache + mod_wsgi 与 nginx + gunicorn

使用 WSGI 和 apache 设置 django

无法使用 mod-wsgi 在 Apache 上部署 django

使用 mod_wsgi 在 apache 上设置 Django

调试 Apache/Django/WSGI 错误请求 (400) 错误