2013-05-08 14 views
8

Sto cercando di utilizzare un'applicazione Flask dietro Amazon Load Balancer e i thread Flask continuano a scadere. Sembra che il bilanciamento del carico stia inviando un'intestazione Connection: keep-alive e questo sta causando il ritorno del processo Flask (o richiede molto tempo). Con il gunicorn di fronte i processi vengono uccisi e ne iniziano di nuovi. Abbiamo anche provato a usare uWSGI e abbiamo semplicemente esposto l'app Flask direttamente (senza wrapper). Tutti i risultati nel processo Flask non rispondono.timeout dell'applicazione pallone con bilanciamento del carico Amazon

Non vedo nulla nei documenti di Flask che farebbero ignorare questa intestazione. Non riesco a capire cos'altro posso fare con Flask per risolvere il problema.

Le arricciature e le connessioni dirette alla macchina funzionano correttamente, solo quelle tramite la bilancia di bilanciamento causano il problema. Il bilanciamento del carico stesso non sembra fare nulla di sbagliato e lo usiamo con successo con diversi altri stack.

risposta

8

La soluzione che ho ora sta usando gunicorn come involucro attorno all'applicazione del pallone. Per il worker_class sto usando eventlet con diversi lavoratori. Questa combinazione sembra stabile e reattiva. Gunicorn è anche configurato per HTTPS.

Suppongo che sia un difetto di Flask che causa il problema e questo è un rimedio efficace.

+0

sei riuscito a capire perché però? – dnozay

+0

Non posso esserne certo, ma sembra proprio un difetto nel modo in cui Flask sta gestendo una richiesta HTTP 1.1. –

+0

Hai presentato un problema al riguardo su GitHub? –

0

Il modo più semplice è forzare tutte le connessioni per assicurarsi di utilizzare HTTP/1.0 e non aggiungere l'intestazione Connection: Keep-Alive alla risposta.

Si prega di checkout werkzeug.http.remove_hop_by_hop_headers().

+0

Come e dove si cambia esattamente? Non ho familiarità con queste impostazioni. Grazie – Joe

0

Avete bisogno di un bilanciatore del carico HTTP? L'utilizzo di un sistema di bilanciamento di livello 4 potrebbe anche risolvere il problema, poiché non interferisce con i livelli di protocollo più elevati.

1

Ti sei ricordato di impostare session.permanent = True e app.permanent_session_lifetime?

+0

Le sessioni non vengono utilizzate. –

+0

Dove lo cambi esattamente? Non ho familiarità con queste impostazioni. Grazie – Joe

Problemi correlati