在 beanstalk 上部署 flask-socketio
Posted
技术标签:
【中文标题】在 beanstalk 上部署 flask-socketio【英文标题】:Deploy flask-socketio on beanstalk 【发布时间】:2019-03-16 07:10:42 【问题描述】:我无法让 Flask-SocketIO 与我在 AWS Elastic Beanstalk (ELB) 上的实例一起工作,需要使用 socketio.run(application) 运行 Flask-SocketIO,ELB 似乎会调用全局应用程序对象本身。
ELB 文档指出使用 application.py 作为文件名并提供可调用的应用程序对象(在本例中为 Flask 对象)允许 Elastic Beanstalk 轻松找到您的应用程序的代码。
我的 ELB 实例日志显示错误 RuntimeError: You need to use the eventlet server。有关详细信息,请参阅文档的部署部分。
假设 AWS 调用 application.run(),有什么方法可以解决这个问题?
提前致谢
【问题讨论】:
【参考方案1】:Flask-SocketIO 对负载均衡器和 Web 服务器有非常具体的要求。我认为您可以使用粘性会话配置 ELB 负载均衡器,这将使其工作,但我认为不起作用的部分是使用 eventlet 或 gevent Web 服务器,因为 AWS 以自己的方式调用可调用对象。您需要的是一种使用 socketio.run()
的方法或启动 eventlet/gevent Web 服务器的等效过程。
【讨论】:
【参考方案2】:AWS beanstalk 最近发生了一些变化。默认情况下,它使用 gunicorn 和 nginx。
我使用没有负载均衡器的单实例设置使设置正常工作。 beanstalk 中的负载均衡器配置允许粘性配置,但我的应用程序设计无论如何只能在单个实例上工作,所以我不在乎。
创建单实例 beanstalk 环境:
eb create --single my_env
然后,配置gunicorn的启动方式:创建文件Procfile
(见aws docs)
eventlet
使用这个:
web: gunicorn --worker-class eventlet -w 1 application:application
并将其放入 requirements.txt:
gunicorn==20.1.0
eventlet==0.30.2
需要特定版本来防止cannot import name 'ALREADY_HANDLED'
错误,请参阅here。
有关 gunicorn/eventlet 之外的其他部署选项,请参阅 flask-socketio doc。
【讨论】:
以上是关于在 beanstalk 上部署 flask-socketio的主要内容,如果未能解决你的问题,请参考以下文章
在 amazon ec2 (beanstalk) 上编辑已部署文件的权限
在 Elastic Beanstalk 上部署 Pyramid 应用程序
在 beanstalk 上部署 flask-socketio