2013-06-06 11 views
8

Sono in esecuzione tornado dietro apache. Ho creato un server proxy.timeout infinito per proxy inverso in Apache

ProxyRequests On 
ProxyPass /chat/ http://localhost:8888/chat/ 

Questo codice funziona in modo ottimale e trasmette tutte le mie richieste al tornado e restituisce la risposta al client.

Ora, sto usando il tornado per il polling lungo. Alcune delle richieste che terminano in un breve intervallo di tempo dicono meno di 1 minuto che questo proxy inverso funziona correttamente. Ma alcune lunghe richieste di polling forniscono 502 errori proxy. Il motivo di questo errore proxy è che Apache può contenere una richiesta di polling lunga solo per un minuto (per impostazione predefinita). Chiude la richiesta e quindi viene ricevuto l'errore del proxy.

Ora, ho modificato la direttiva per

ProxyRequests On 
ProxyPass /chat/ http://localhost:8888/chat/ timeout=12000 

cioè ho cambiato il timeout predefinito a 12000 secondi.

Attualmente funziona correttamente per me. Questa non è la migliore soluzione al problema. Le richieste di polling idealmente lunghe possono superare qualsiasi timeout specificato. Quindi le mie domande sono

  1. Come rendere il timeout infinito? la richiesta non viene mai chiusa da Apache.
  2. Si prega inoltre di commentare: se le prestazioni del tornado sono degradate passando attraverso Apache come server proxy?
+0

Ehi, la mia risposta ti ha aiutato? Puoi commentare la risposta per favore? – vaidik

risposta

1

Ho riscontrato un problema simile con Nginx e l'ho risolto nello stesso modo in cui lo avete fatto. Ma ho cambiato il timeout a 1 giorno perché era sufficientemente grande nel mio caso.

Penso che tu non possa farla franca. La logica dietro questo è che Apache (o qualsiasi server proxy per quella materia) deve mantenere le sue prestazioni, che chiaramente non può se deve contenere connessioni stantie o inattive. Preferisci lasciare che il tuo proxy server proxy più connessioni attive rispetto alle connessioni inattive.

Pertanto, non è possibile disattivare ProxyTimeout in Apache o anche in Nginx (configurato utilizzando proxy_read_timeout). Pertanto, se il server proxy non invia alcuna risposta entro il timeout, il server delle applicazioni impiega troppo tempo a rispondere o c'è qualcosa che non va nel server delle applicazioni o il client non richiede alcuna risposta. Nel primo caso, puoi fare delle stime sicure per impostare un timeout appropriato. Nel secondo caso, è necessario correggere il server delle applicazioni. E nel terzo caso, devi gestire con garbo la situazione sul client e riconnetterti se necessario.

Venendo alla tua seconda domanda, non ci dovrebbe essere alcuna differenza oltre alla latenza coinvolta tra il tuo Apache e il tuo server Tornado. Puoi benissimo esporre il tuo server Tornado direttamente al mondo, ma con alcune sfide: 1. Altre operazioni funzionano - assicurati che il processo di Tornado sia sempre attivo e funzionante. 2. Il proxy e il bilanciamento del carico diventeranno più difficili. 3. Peggiore sicurezza dato che hai scritto quel codice invece di migliaia di contributori esperti. Quindi non dovresti pensare di far girare questo server come root ogni. Ma puoi tranquillamente fare lo stesso con Apache o Nginx.

Ovviamente i problemi di cui sopra sono risolvibili, ma perché risolvere un problema già risolto. :)