Mei*_*tro 18 apache django mod-wsgi wsgi amazon-elastic-beanstalk
我正在尝试将Django应用程序部署到Elastic Beanstalk.当我访问页面时,它永远不会加载.日志说:
Script timed out before returning headers: wsgi.py
Run Code Online (Sandbox Code Playgroud)
我可以进入服务器并运行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
Run Code Online (Sandbox Code Playgroud)
还有我的wsgi.py文件:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "aurora.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)
有什么可能导致这种情况的线索?
更新:
我重建了我的环境并再次遇到了这个问题.我更新/etc/httpd/conf.d/wsgi.conf了包含WSGIApplicationGroup %{GLOBAL} 在这里提到的.我使用的是Scipy,Numpy和GeoDjango(使用GDAL).我知道GDAL不是完全线程安全的,我不确定其他的,但我认为这是一个线程安全问题.
Mei*_*tro 12
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)
Run Code Online (Sandbox Code Playgroud)
我删除了它,它修复了问题.
我对任何人的建议
Script timed out before returning headers: wsgi.py
Run Code Online (Sandbox Code Playgroud)
是检查你wsgi.py文件.
我们的解决方法是WSGIApplicationGroup %{GLOBAL}根据Meistro 的回答添加设置。
您需要确保wsgi通过.ebextensions/foobar.config文件编辑配置,以便更改是永久性的。请参阅 .ebextensions 配置文档。
将以下内容添加到您的.ebextensions/foobar.config文件中:
files:
"/etc/httpd/conf.d/wsgi_custom.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIApplicationGroup %{GLOBAL}
Run Code Online (Sandbox Code Playgroud)
这将创建(或覆盖)/etc/httpd/conf.d/wsgi_custom.conf文件的内容WSGIApplicationGroup %{GLOBAL}