在 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

在 Elastic Beanstalk 上部署 Wordpress 的多个问题

Elastic Beanstalk 未部署在所有实例上

在 Elastic Beanstalk 上部署 NestJS 应用程序