[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