我正在尝试在Amazon Load Balancer后面使用Flask应用程序,并且Flask线程会保持超时。似乎负载均衡器正在发送Connection: keep-alive
标头,这导致Flask进程永远不会返回(或需要很长时间)。在前面有枪炮,过程被杀死,新的过程开始。我们还尝试使用uWSGI并简单地直接暴露Flask应用程序(没有包装器)。所有这些都导致Flask进程无法响应。
我在Flask文档中看不到任何会使它忽略此标题的内容。我不知道我还能用Flask做些什么来解决这个问题。
卷曲和与机器的直接连接工作正常,只有那些通过负载平衡器导致问题。负载均衡器本身似乎没有做错任何事情,我们成功地将其与其他几个堆栈一起使用。
答案 0 :(得分:8)
我现在的解决方案是使用gunicorn作为烧瓶应用的包装。对于worker_class
我使用eventlet
和几个工作人员。这种组合似乎稳定且反应灵敏。 Gunicorn也配置了HTTPS。
我认为Flask中存在导致问题的缺陷,这是一种有效的解决方法。
答案 1 :(得分:1)
您还记得设置session.permanent = True
和app.permanent_session_lifetime
吗?
答案 2 :(得分:0)
最简单的方法是强制所有连接,以确保您使用的是HTTP/1.0
,而不是在回复中添加标题Connection: Keep-Alive
。
请结帐werkzeug.http.remove_hop_by_hop_headers()
。
答案 3 :(得分:0)
您需要HTTP负载均衡器吗?使用第4层平衡器也可以解决您的问题,因为它不会干扰更高的协议级别。