[Python] Deploy con nginx e proxy_pass

Alessandro Dentella sandro a e-den.it
Ven 3 Gen 2014 19:20:26 CET


On Fri, Jan 03, 2014 at 12:50:54PM +0100, Roberto De Ioris wrote:
> 
> > 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)
> 
> Provate a ridurre a 3 secondi il proxy_connect_timeout di nginx, e'
> probabile che abbiate sempre almeno uno slot listen_queue libero anche se
> lo avete impostato a 1/0. In questo modo se la connessione non completa in
> 3 secondi, nginx considera il peer morto (e passa a quello dopo se lo
> avete configurato a dovere)

nessun cambiamento. Il proxy_connect_timeout pare proprio ignorato. 
questa la conf:

server {
    listen 80;
    server_name ngtest;
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 3s;
        proxy_pass http://produzione;
    }
}

> > Credo di capire che vengono descritte più opzioni di configurazione: con i
> > greenlet ed una programmazione asincrona o con processi tornado
> > indipendenti.
> 
> guarda terrei questo approccio proprio come ultima spiaggia (e
> probabilmente e' piu' semplice modificare tornado) se la soluzione sopra
> non dovesse funzionare

ecco appunto...
Il primo punto: capisco correttamente che la conf è quella descritta nel
capitoletto "Binding and listening with Tornado"?

Nella mail precedente scrivevi:

> L'approccio migliore (o meglio diciamo quello risolutivo) e' che i
> processi usino lo stesso socket, puoi provare il plugin tornado di uWSGI:

ora la dici "ultima spiaggia". come mai?


sandro
*:-)



Maggiori informazioni sulla lista Python