我正在尝试将Django应用程序部署到Elastic Beanstalk。当我访问页面时,它永远不会加载。日志说:
Script timed out before returning headers: wsgi.py
我可以ssh进入服务器并从另一个终端运行manage.py runserver
然后运行curl 127.0.0.1:8000
,这将成功返回页面。所以我认为它必须是Apache配置的一个问题,它被设置为Elastic Beanstalk的一部分。
这里有更多的日志:
[pid 15880] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[so:warn] [pid 15880] AH01574: module wsgi_module is already loaded, skipping
[auth_digest:notice] [pid 15880] AH01757: generating secret for digest authentication ...
[lbmethod_heartbeat:notice] [pid 15880] AH02282: No slotmem from mod_heartmonitor
[mpm_prefork:notice] [pid 15880] AH00163: Apache/2.4.9 (Amazon) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[core:notice] [pid 15880] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[:error] [pid 15881] /opt/python/run/venv/lib/python2.7/site-packages/numpy/oldnumeric/__init__.py:11: ModuleDeprecationWarning: The oldnumeric module will be dropped in Numpy 1.9
[:error] [pid 15881] warnings.warn(_msg, ModuleDeprecationWarning)
[:error] [pid 15881]
[core:error] [pid 15884] [client 10.248.110.45:58996] Script timed out before returning headers: wsgi.py
还有我的wsgi.py文件:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "aurora.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
有什么可能导致这种情况的线索?
更新:
我重建了我的环境并再次遇到了这个问题。我更新了/etc/httpd/conf.d/wsgi.conf
以包括WSGIApplicationGroup %{GLOBAL}
as mentioned here。我使用的是Scipy,Numpy和GeoDjango(使用GDAL)。我知道GDAL不是完全线程安全的,我不确定其他的,但我认为这是一个线程安全问题。
2017年2月8日更新
以前我的wsgi.conf
只使用一个过程:
WSGIDaemonProcess wsgi processes = 1 threads = 15 display-name =%{GROUP}
我将流程提升到更合理的程度,并且没有任何问题:
WSGIDaemonProcess wsgi processes = 6 threads = 15 display-name =%{GROUP}
这一变化以及WSGIApplicationGroup %{GLOBAL}
的原始添加似乎已经成功了。
2015年9月17日更新
我偶尔会遇到这个问题。通常,通过eb deploy
重新部署可以解决问题。很难说底层问题是什么。
原始答案
我最终让项目工作,但后来尝试创建一个用于新实例的图像,重新打开了问题。我不确定为什么它工作然后停止工作但我从头开始重建我的自定义AMI然后重新推出我的项目。事实证明这是wsgi.py
的一个问题。我发布的版本实际上与部署的版本不同。出于某种原因,另一位开发人员将其放入wsgi.py
:
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if path not in sys.path:
sys.path.append(path)
我删除了它,它修复了问题。
我对任何人的建议
Script timed out before returning headers: wsgi.py
是检查你wsgi.py文件。
这肯定看起来像你提到的WSGI和Apache的问题。要仔细检查的一件事是源目录中的.ebextensions文件。
应该有一个配置,指定WSGI信息,如应用程序的位置。您可能还想检查Django设置并使用WSGI在Apache设置本地运行它。
您可能已经阅读过WSGI和Django的官方文档,但这可能会有一些您可能错过的简单事情:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Python_django.html#create_deploy_Python_django_update
就我遇到的类似问题而言,仅仅是2美分。
我遇到了类似的问题。事实证明,从django应用程序执行的脚本(进行数据库插入/更新/删除调用)正在等待处于死锁状态,以便释放表上的锁。一旦它被释放,代码就会没有这个错误。我从来没有必要重新部署我的EB应用程序。
我们的修复是根据WSGIApplicationGroup %{GLOBAL}
添加Meistro's answer设置。
您需要确保通过wsgi
文件编辑.ebextensions/foobar.config
配置,以便更改是永久性的。 See the .ebextensions config docs。
将以下内容添加到.ebextensions/foobar.config
文件中:
files:
"/etc/httpd/conf.d/wsgi_custom.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIApplicationGroup %{GLOBAL}
这将使用/etc/httpd/conf.d/wsgi_custom.conf
创建(或覆盖)WSGIApplicationGroup %{GLOBAL}
文件的内容
我已经尝试了上述步骤,可以暂时解决问题。然后我做了以下步骤:
WSGIApplicationGroup:
command: grep -rnw 'WSGIApplicationGroup' config.py || sed -i.bak '/LogFormat/ a WSGIApplicationGroup %%{GLOBAL}' config.py
cwd: /opt/elasticbeanstalk/hooks
感谢帮助让这个谁给出了这种类型的错误的建议
我终于修好了。刚刚阅读了关于apache mpm加载模块的概念
我从apache preforker(我的情况)模块更改了默认加载模式,这取决于操作系统。
找到下面的位置
位置:/etc/httpd/conf.module.d/00-mpm*.
启用依赖于我们案例的工作模块
LoadModule mpm_worker_module lib64/httpd/modules/mod_mpm_worker.so
再次感谢谁帮助了我。