[Python] Deploy con nginx e proxy_pass
Manlio Perillo
manlio.perillo a gmail.com
Ven 3 Gen 2014 20:58:25 CET
On 03/01/2014 18:42, Alessandro Dentella wrote:
> On Fri, Jan 03, 2014 at 12:45:02PM +0100, Manlio Perillo wrote:
>> On 03/01/2014 12:34, Alessandro Dentella wrote:
>>> [...]
>>> La nostra simulazione è stata fatta con 2 funzioni: is_up e blocking che usa
>>> time.sleep()
>>>
>>> class IsUp(tornado.web.RequestHandler):
>>> def get(self):
>>> self.write("Is Up Porta %d" ...)
>>> self.finish()
>>>
>>> class Blocking(tornado.web.RequestHandler):
>>> def get(self, numero=10):
>>> time.sleep(int(numero))
>>> self.write("Bloccato Porta %s\n" % options.port)
>>> self.finish()
>>>
>>> la chiamata usando 'wget -q -O - http://ngtest/blocking/30/' ed
>>> interrompendolo con Control-c.
>>
>> Ok.
>> Ma quante instanze di tornado hai attive?
>
> 10 al momento, vedi descrizione qui [1]
>
Allora, vediamo se ho capito.
Hai scritto che:
> la chiamata usando 'wget -q -O - http://ngtest/blocking/30/' ed
> interrompendolo con Control-c.
> In un terminale separato in ciclo di
> 'wget -q -O - http://ngtest/is_up'
> Il ciclo si blocca nel momento della interruzione e riprende solo
> quando termita il tempo (e quindi il processo si libera)
Quindi quello che fai è prima richiedere http://ngtest/blocking/30/, in
modo che una delle instanze di tornado si blocchi per 30 secondi, e poi
un serie di richieste normali per vedere se le altre instanze rispondono.
Quello che succede è che in condizioni normali, ottieni subito una
risposta instantanea, ma non appena termini in modo brusco la prima
richiesta, Nginx considera quella instanza libera e quindi una delle
richieste normali blocca.
Secondo me il problema è quello che ti ha indicato Roberto.
La tua instanza di tornado è bloccata dalla sleep, ma continua ad
accettare connessioni a causa della backlog nella listen.
Vedi:
http://stackoverflow.com/questions/5111040/listen-ignores-the-backlog-argument
Se usi Linux quindi direi che hai un bel problema.
> [...]
> Come già detto in altra mail, il problema residuo sorge quando una chiamata
> viene interrotta. Nginx libera subito la risorsa e passa una nuova chiamata
> a quel processo che in realtà è ancora occupato.
>
E' occupato, ma continua ad accettare connessioni da parte di Nginx.
Mi vengono in mente un paio di soluzioni brusche, ma dipende da come
gestisci questa situazione nel caso "reale".
Nel test che hai fatto, interrompevi la connessione manualmente.
Nel caso reale cosa succede?
Da quello che scrivi mi sembra di capire che la connessione venga
interrotta bruscamente. Ma in che modo?
Ad esempio, per "risolvere" il problema, puoi terminare e poi riavviare
il processo nel caso in cui una connessione con Nginx viene interrotta
prima che la richiesta HTTP termini normalmente. Non so se è possibile
nel tuo caso, dovrei fare dei test.
Ciao Manlio
Maggiori informazioni sulla lista
Python