[Python] Deploy con nginx e proxy_pass

Roberto De Ioris roberto a unbit.it
Mar 24 Dic 2013 11:58:05 CET



>
> io sono convinto che se il modello resta round robbin puro, anche se
> raddoppiassi i processi avrei solo dimezzato la probabilità di incapare in
> una chiamata "lunga", mentre se potessi evitare di passare chiamate ad un
> processo che sta lavorando eviterei proprio questa cosa.
>
>
>> aggancia una strace ai processi tornado durante un blocco per vedere che
>> succede. Probabilmente non ci sara' molto da fare se non aggiungere
>> altri
>> processi tornado (sempre che sia tollerabile dall'applicazione).
>
> le chiamate lunghe non sono chiamate che a random prendono tanto tempo,
> sono
> chiamate che "fanno molte cose" probabilmente non ottimizzate, ma sulle
> quali io non ho diretto controllo (sono inizializzazioni mensili di alcune
> posizioni).
>
> Grazie per il suggeriemnto
> sandro
> *:-)

Nginx non puo' farlo (vedi pero' nota sotto)

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

ma non e' compilato di default (per motivi altamente tecnici: ovvero odio
la programmazione callback based e non voglio incentivarla ulteriormente
;)

anche gunicorn ha un worker model per tornado ma e' deprecato (ma presumo
funzioni ancora)

Nota:
Se abbassi la listen queue del socket dentro tornado a 1 (in alcuni kernel
puoi metterla anche a 0 che sarebeb addirittura meglio), otterrai subito
un errore in caso di worker occupato e nginx passera' la richiesta al
backend successivo. E' un buon trucco (anche se poco diffuso) nel tuo caso
specifico.

Altro approccio e' ridurre il proxy_connect_timeout, ma trovare il giusto
compromesso sul valore e' dura

-- 
Roberto De Ioris
http://unbit.it


Maggiori informazioni sulla lista Python