EC2上Gunicorn外部调用时总是出现工作进程超时
我正在尝试让我的Flask应用在Gunicorn上运行,并通过Nginx进行前端处理。我想边测试边进行,所以我先在Flask的开发服务器上把一切都搞定了,内部和外部的AWS都能正常工作。然后我启动了Gunicorn并进行了测试。简单地访问一下/status接口,返回'running'是正常的,但工作进程总是超时并重启。
我开始动手简化问题,现在我可以用一个简单的wsgi脚本重现这个问题:
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ["Hello!"]
我使用的Gunicorn命令行是:
var/www/py_api/app/var/www/py_api/venv/bin/python /var/www/py_api/venv/bin/gunicorn -b <private_IP>:4000 test_server
我尝试绑定到0.0.0.0,结果也差不多。绑定到127.0.0.1只能在内部工作,但无法重现这个问题。
我在EC2的中型实例上运行一切,操作系统是Ubuntu 12.04,使用的是默认的VPC。
我是在virtualenv环境中运行的。这里是pip freeze的输出:
Babel==1.3
Flask==0.10.1
Flask-Babel==0.9
Flask-Login==0.2.10
Flask-Mail==0.9.0
Flask-SQLAlchemy==1.0
Flask-User==0.4.9
Flask-WTF==0.9.5
Jinja2==2.7.2
MarkupSafe==0.21
SQLAlchemy==0.9.4
WTForms==1.0.5
Werkzeug==0.9.4
argparse==1.2.1
awscli==1.3.11
bcdoc==0.12.2
blinker==1.3
botocore==0.45.0
colorama==0.2.5
docutils==0.11
hashids==1.0.0
itsdangerous==0.24
jmespath==0.4.1
oursql==0.9.3.1
passlib==1.6.2
py-bcrypt==0.4
pyasn1==0.1.7
pycrypto==2.6.1
python-dateutil==2.2
pytz==2014.2
requestes==0.0.1
requests==2.3.0
rsa==3.1.2
six==1.6.1
speaklater==1.3
virtualenv==1.11.4
wsgiref==0.1.2
在解决这个问题之前,我不太想继续使用Nginx。
总结: 如果我在本地使用curl,一切都正常。但如果从外部访问,无论是通过ELB还是直接访问机器,我都会遇到超时的问题。这不仅仅是curl的问题。
猜测: 我读到过Gunicorn和ELB之间的问题,我在想,既然所有EC2实例都放在了至少一个默认的VPC中,是否意味着任何外部流量都要通过一个透明的ELB。
1 个回答
试着根据你的需求添加一个超时时间。
在你的服务文件(/etc/systemd/system/your_app
.service)中,给ExecStart
添加一个新的参数-t 900
。
下面是一个例子:
ExecStart=/home/ubuntu/anaconda3/envs/env_name/bin/gunicorn --error-logfile ./error.log -w 4 --access-logfile ./access.log -t 900 -b unix:app_name.sock -m 007 wsgi:app
想了解更多信息,可以查看这个链接 http://docs.gunicorn.org/en/stable/settings.html#timeout。