【问题标题】:Deploy flask-socketio on beanstalk在 beanstalk 上部署 flask-socketio
【发布时间】: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(),有什么方法可以解决这个问题?

提前致谢

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk flask-socketio


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-01-19
        • 1970-01-01
        • 2017-11-09
        • 2020-08-02
        • 2022-06-23
        • 2019-03-24
        • 2020-04-29
        • 2012-09-10
        • 2020-12-25
        相关资源
        最近更新 更多