我不能让Flask-SocketIO在AWS Elastic Beanstalk ( ELB )上与我的实例一起工作,由于需要使用socketio.run(应用程序)运行Flask-SocketIO,ELB似乎对全局应用程序对象本身进行了调用。
ELB文档指出,使用application.py作为文件名并提供一个可调用的应用程序对象(在本例中为Flask对象)允许Elastic Beanstalk轻松找到应用程序的代码。
我的ELB实例日志显示错误RuntimeError:您需要使用eventlet服务器。有关详细信息,请参阅文档的部署部分。
假设亚马逊网络服务调用application.run(),有没有办法解决这个问题?
提前感谢
发布于 2018-10-25 19:25:33
Flask-SocketIO对负载均衡器和web服务器有非常特殊的要求。我认为你可以用粘性会话配置ELB负载均衡器,这会让它工作,但我认为不起作用的部分是使用eventlet或gevent web服务器,因为AWS以自己的方式调用callable。您需要的是一种使用socketio.run()或启动eventlet/gevent web服务器的等效过程的方法。
发布于 2021-12-22 16:11:14
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。
查看flask-socketio doc以了解除gunicorn/eventlet之外的其他部署选项。
https://stackoverflow.com/questions/52756046
复制相似问题