Django/Wsgi/Apache 抛出 Premature end of script 错误并且通常的解决方案都不起作用

Posted

技术标签:

【中文标题】Django/Wsgi/Apache 抛出 Premature end of script 错误并且通常的解决方案都不起作用【英文标题】:Django/Wsgi/Apache throws Premature end of script errors and none of the usual solutions work 【发布时间】:2012-02-27 20:22:45 【问题描述】:

在一个非常标准和次要的版本之后,我们的 Apache/nginx/Django/wsgi 设置停止了与可怕的功能

脚本头提前结束:django.wsgi

日志中的消息。任何地方都没有段错误,也没有其他错误消息。

不存在外籍人士问题(通过包含和不包含该模块的示例 wsgi 应用程序进行检查)。 服务器工作正常。代码库略有更新,当恐怖开始时 apache 重新启动。

这是我的 wsgi 文件:


import sys
import os

sys.path.append('/home/app/')
sys.path.append('/home/app/topmodule/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings'
os.environ["CELERY_LOADER"] = "django"

import app.settings
import django.core.handlers.wsgi

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

这个站点的 apache conf 是:


WSGIScriptAlias / /home/app/topmodule/django.wsgi
WSGIDaemonProcess app user=app group=app processes=6 threads=1
WSGIProcessGroup app

我也尝试添加:

WSGIApplicationGroup %GLOBAL

但那里没有帮助。 我得到的只是一个 apache 服务器错误页面和错误日志中该死的过早结束错误。

我确实尝试回滚代码库,但这也没有任何好处,这让我怀疑这不是新的代码问题。

编辑 我已将段错误缩小到 Django 的 wsgi.py 中的一行。

追踪:

http://paste.pocoo.org/show/546803/

一些转储:

http://paste.pocoo.org/show/546846/

在请求任何 url 时都会发生这种情况。 使用的中间件:


    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.gzip.GZipMiddleware',

【问题讨论】:

这是 Debian Squeeze 上的 Python 2.6.4、django 1.3.1、apache 2 你仔细检查了 django 仍然是在系统路径上,不是吗?它是如何安装的?虚拟环境?全局 pip 安装? 它通过 pip (全局)安装。这是我的 sys.path: >>> import sys >>> sys.path ['', '/usr/local/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg', ' /usr/local/lib/python26.zip', '/usr/local/lib/python2.6', '/usr/local/lib/python2.6/plat-linux2', '/usr/local/lib/ python2.6/lib-tk'、'/usr/local/lib/python2.6/lib-old'、'/usr/local/lib/python2.6/lib-dynload'、'/usr/local/lib /python2.6/site-packages', '/usr/local/lib/python2.6/site-packages/PIL'] 如果我将 hello world wsgi 应用程序放在我的 wsgi 文件中的所有常规 django 应用程序调用之后(覆盖 django 文件)它可以工作并且我确实得到了 hello world。 我已经通过python调试器运行了wsgi,并且跟踪粘贴在下面的链接中。请注意,错误在 django/core/handlers/wsgi.py 上得到响应时:paste.pocoo.org/show/546803 【参考方案1】:

您可以尝试将 django 路径显式添加到您的 sys.path 中吗?

sys.path.append('/usr/local/lib/python2.6/site-packages/django')

(仔细检查它是否真的存在 :))

【讨论】:

我将它添加到 django.wsgi 文件中,甚至稍后打印它以确保它通过日志确实存在.... @Harel 哇,你在response = self.get_response(request) 遇到了分段错误!您可以将应该回答您正在尝试的网址的视图复制到问题中(pastebin 或类似的东西很好)吗?还有你在设置中使用了哪些中间件? 我更新了问题。我对这个段错误感到非常惊讶,更重要的是因为在我回滚任何代码更改后它突然出现并且卡住了。谢谢!【参考方案2】:

我最终重新安装了 apache、mod wsgi 和所有相关的软件包。在某些时候出现了一个警告错误,即 mod_wsgi 是针对 Python 2.6.6 编译的,而运行时是 Python 2.6.4。 我将 Python 从源代码重建为 2.6.6,问题得到解决。我不确定是次要版本更新还是修复它的整个重建。我也不确定为什么它直到现在才起作用,突然停止工作,但至少现在一切正常。

【讨论】:

只要 mod_wsgi.so 链接到 Python 共享库而不是静态链接,补丁版本差异应该无关紧要。也就是说,也许 mod_wsgi.so 是针对较新的补丁版本编译的问题。通常情况会相反,Python 已更新但 mod_wsgi 未更新。很高兴看到你至少让它工作了。

以上是关于Django/Wsgi/Apache 抛出 Premature end of script 错误并且通常的解决方案都不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django + mod_wsgi + apache:ImportError at / No module named djproj.urls

Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named 'math'

Django wsgi Apache2:'AH01630:服务器配置拒绝客户端'

Django + mod_wsgi + apache2 - 子进程 XXX 仍然没有退出,发送一个 SIGTERM

Flask、mod_wsgi 和 Apache:ImportError

如何对mysql抛出异常(php)