[Python] Deploy con nginx e proxy_pass

Alessandro Dentella sandro a e-den.it
Ven 3 Gen 2014 12:34:01 CET


On Mon, Dec 30, 2013 at 05:26:57PM +0100, Roberto De Ioris wrote:
> > Mi pare di capire che la soluzione della listen queue che mi hai indicato
> > risolverebbe questo problema.
> >
> 
> 
> server = HTTPServer(app)
> server.bind(post, backlog=1)
> 
> (prova anche con zero, su alcuni kernel funziona, anche se non ricordo se
> e' per quelli piu' recenti o quelli piu' vecchi)

Purtroppo questa strada non ha funzionato. Ricordo che il probelma che
cerchiamo di risolvere è che quando viene interrotto una chiamata "lunga",
nginx libera quella connessione e quindi diritta verso quel processo la
prossima chiamata, ma il processo di fatto è occupato.

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.
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)

> >> L'approccio migliore (o meglio diciamo quello risolutivo) e' che i
> >> processi usino lo stesso socket, puoi provare il plugin tornado di
> >> uWSGI:
> >>
> >> http://uwsgi-docs.readthedocs.org/en/latest/Tornado.html

Siamo passato quindi a leggere la documentazione per fare questa prova ma
ammetto che ho qualche dubbio. Dimmi per cortesia se scrivo inesattezze... 

Credo di capire che vengono descritte più opzioni di configurazione: con i
greenlet ed una programmazione asincrona o con processi tornado
indipendenti.

Considerando che il tutto nasce proprio dal fatto che abbiamo probelmi nelle
funzioni che NON sono state scritte in modo asincrono quello che vogliamo è
di usare la configurazione descritta in fondo "Binding and listening with
Tornado".

Mi pare di capire che in questa ipotesi vengano fatti partire processi
differenti e per ogni processo venga eseguito "start_the_tornado_servers",
finiremmo quindi -come ora- ad avere svariati server tornado in ascolto ma
con la differenza che il routing fra un server e l'altro sarebbe gestito da
uwsgi, corretto? è in questa situazione che uwsgi usa lo stesso socket per
tutti i processi?

*Se* fin qui e` corretto mi resta poi da capire come mai
'start_the_tornado_servers' lanci application e non 't_application' e come
construire la application che viene chiamata da uwsgi. Nell'esempio i 3
puntini presuppongono un lettore meno confuso del sottoscritto...


Lascio poi al mio collega un'altra domanda su un probelma di segfault...

grazie per l'attenzione
sandro
*:-)



Maggiori informazioni sulla lista Python