Django,apache,mod_wsgi - 错误:脚本头过早结束

Posted

技术标签:

【中文标题】Django,apache,mod_wsgi - 错误:脚本头过早结束【英文标题】:Django, apache, mod_wsgi - Error: Premature end of script headers 【发布时间】:2011-05-28 23:01:15 【问题描述】:

Apache 登录模式调试:

[Tue Dec 21 11:36:33 2010] [info] [client 1.53.149.114] mod_wsgi (pid=24831, process='mysite', application='mysite.com|'): Loading WSGI script '/home/anhtran/webapps/mysite.com/django.wsgi'.
[Tue Dec 21 11:36:33 2010] [error] [client 1.53.149.114] Premature end of script headers: django.wsgi
[Tue Dec 21 11:36:33 2010] [notice] child pid 24831 exit signal Segmentation fault (11)
[Tue Dec 21 11:36:33 2010] [info] mod_wsgi (pid=24980): Attach interpreter ''.

我的配置文件:

WSGISocketPrefix /tmp/wsgi

<VirtualHost *:80>
   ServerName mysite.com
   ServerAlias www.mysite.com
   ServerAdmin admin@mysite.com

   DocumentRoot /home/anhtran/webapps/mysite.com/public_html

   WSGIDaemonProcess mysite processes=5 threads=25
   WSGIProcessGroup mysite
   WSGIScriptAlias / /home/anhtran/webapps/mysite.com/django.wsgi

   LogLevel debug

   <Directory /home/anhtran/webapps/mysite.com/mysite>
      Order allow,deny
      Allow from all
   </Directory>

</VirtualHost>

Django 在没有数据连接(如 mysqldb 或 sqlite3)的基本项目中工作正常。 我正在使用 CentOS 5 64 位、apache 2.x、mod_wsgi 3.2。 我认为这不是 Django 的问题,但我不知道。大家能解决吗?帮我。 谢谢! :)

django.wsgi

#!/usr/local/bin/python
import os, site, sys

# add the virtual environment path
site.addsitedir('/home/anhtran/webapps/mysite.com/env/lib/python2.6/site-packages')
site.addsitedir('/home/anhtran/webapps/mysite.com/mysite')
site.addsitedir('/home/anhtran/webapps/mysite.com')

# fix markdown.py (and potentially others) using stdout
sys.stdout = sys.stderr

#Calculate the path based on the location of the WSGI script.
project = os.path.dirname(__file__)
workspace = os.path.dirname(project)
sys.path.append(workspace)

os.environ['PYTHON_EGG_CACHE'] = '/home/anhtran/webapps/mysite.com/.python-eggs'
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

我在此链接中阅读了一些问题:http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions 但我仍然不明白解决方案。

【问题讨论】:

你能发布你的 django.wsgi 文件吗? django.wsgi 文件已添加。我希望它能帮助你提出一些想法:( 我没有任何具体建议,但我发现此链接可能会有所帮助:htmlfixit.com/cgi-tutes/… 【参考方案1】:

守护进程崩溃。有关导致崩溃的原因,请参阅 mod_wsgi 常见问题解答中的 cmets:

http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions

然后点击那里的链接。

最终原因可能有很多,包括同时加载不兼容的 mod_python,使用不兼容子解释器的 Python C 扩展模块,Apache 使用的不兼容共享库版本和/或 php 中的扩展模块等。

【讨论】:

我遇到了由 Python C 扩展引起的同样问题。我在我的 Apache 配置中添加了“WSGIApplicationGroup %GLOBAL”,它解决了这个问题。该指令强制 WSGI 应用程序在第一个 Python 子解释器中运行,这消除了导致 Apache 重新启动进程的死锁。您可以在Google Wiki 上阅读更多相关信息 @Graham 我在日志文件中有 66 行。阅读此 mod wsgi 守护进程时崩溃。请帮助在 wsgi 应用程序中读取大 GB 文件。 @Mushir 创建一个新问题,或者如果您认为它需要讨论,请改用 mod_wsgi 邮件列表。 modwsgi.readthedocs.io/en/develop/finding-help.html【参考方案2】:

最后,我找到了解决方案。这是多个 Python 版本的问题:http://code.google.com/p/modwsgi/wiki/InstallationIssues#Multiple_Python_Versions。

谢谢大家! :P

【讨论】:

这也是我的确切问题,服务器运行的是 Python 2.7 附带的 Natty,但安装 mod_wsgi 也会安装 python2.6,因为这是模块使用的那个。通过在没有显式 python 解释器的情况下创建虚拟环境,假定系统默认值 (v2.7) 与 mod_wsgi 要求 (v2.6) 冲突。在重新创建环境但使用 python2.6 可执行文件并更新了一些路径引用后,它可以工作了。【参考方案3】:

我在虚拟机上安装的 django、apache2、mod_wsgi、python2.6 上遇到了类似的问题。我解决了分配给虚拟机的内存问题。

我希望这会有所帮助。

【讨论】:

由于OOM而崩溃绝对是这个不友好错误消息背后的原因之一。【参考方案4】:

尝试删除此

WSGISocketPrefix /tmp/wsgi

还有这个

WSGIDaemonProcess mysite processes=5 threads=25
WSGIProcessGroup mysite

在我的服务器上它可以工作。

【讨论】:

用你的方式,没有反应。这意味着没有错误也没有数据:(【参考方案5】:

我遇到了同样的错误,虽然根本原因可能是多个 python 版本,但我发现它的发生是因为从 Django 到我的 MySQL 服务器的查询挂起。如果我运行一个

show processlist;

在 MySQL 提示符下,我看到查询正在队列中备份。如果我终止顶部的查询,所有其他打开的进程都会立即完成,我的网站就会恢复生机。

希望这对其他人有所帮助。你也可以运行

show full processlist;

查看确切的查询。就我而言,这是一个 django select_related 查询,它在查询中创建了大量的 INNER JOIN 子句。

见:http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html

【讨论】:

【参考方案6】:

我同样的问题是这样解决的:删除我有一天添加的 cgi 配置:

AddHandler cgi-script .py

【讨论】:

以上是关于Django,apache,mod_wsgi - 错误:脚本头过早结束的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_wsgi 在 apache 上设置 Django

Django,apache,mod_wsgi - 错误:脚本头过早结束

Apache + mod_wsgi + django:为积压的请求发送默认响应

Django/Apache 使用 mod_wsgi 冻结

使用 Apache 和 mod_wsgi 在 Centos 上设置 Django

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