2012-03-22 13 views
5

È possibile in qualche modo passare attraverso la limitazione keepalive di uwsgi? In caso contrario, qual è il modo migliore di implementazione della connessione persistente. Sto usando NGiNX + uWSGI (Python) e voglio che i client abbiano aggiornamenti asincroni dal server.uWSGI keepalive

risposta

1

Stai parlando di due cose diverse. Se desideri connessioni persistenti dai tuoi clienti alla tua app, potresti voler utilizzare le modalità asincrone (tramite ugreen, gevent ...). In questo modo sarai in grado di mantenere migliaia di connessioni simultanee. Keepalive è un modo per instradare più richieste alle stesse connessioni, ma questo è abbastanza inutile per il tuo scopo. Invece, se ti riferisci a connessioni persistenti tra nginx e uWSGI, non c'è modo (al momento) in nginx di raggiungere tale comportamento. Si consiglia di seguire questo biglietto:

http://projects.unbit.it/uwsgi/ticket/66

si tratta del fastrouter, ma sarà applicata in httprouter troppo. Ma è ancora in fase di forte sviluppo.

1

No, non è possibile, perché uwsgi basato su SCGI e chiude le prese dopo ogni richiesta. Utilizzare invece FastCGI.

1

UWSGI supporta keep-alive tramite l'opzione --http-keepalive se si ricevono richieste tramite http.

/tmp$ cat app.py 
def application(env, start_response): 
    content = b"Hello World" 
    start_response('200 OK', [ 
     ('Content-Type','text/html'), 
     ('Content-Length', str(len(content))), 
    ]) 
    return [content] 

Run con:

/tmp$ uwsgi --http=:8000 --http-keepalive -w app &> /dev/null 

e possiamo vedere connect chiamate tramite strace:

~$ strace -econnect wrk -d 10 -t 1 -c 1 http://127.0.0.1:8000 
connect(3, {sa_family=AF_INET, sin_port=htons(8000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 
Running 10s test @ http://127.0.0.1:8000 
    1 threads and 1 connections 
    Thread Stats Avg  Stdev  Max +/- Stdev 
    Latency 92.32us 56.14us 2.81ms 97.20% 
    Req/Sec 11.10k 389.34 11.84k 68.32% 
    111505 requests in 10.10s, 7.98MB read 
Requests/sec: 11040.50 
Transfer/sec: 808.63KB 
+++ exited with 0 +++ 

Vedi? Solo una connessione.

+0

L'opzione '-c 1' imposta la quantità di connessioni attive contemporaneamente, ma non è necessario funziona in modalità keep-alive: https://github.com/wg/wrk/blob/91655b5520b524fc0b802ad12220c9dcd546757e/src/http_parser.c#L2123 . UWSGI aggiunge 'Connection: close' ad ogni risposta. Ma questo strumento 'uwsgi' potrebbe funzionare in modalità keep-alive per soluzione temporanea se la dimensione del contenuto è nota: http://uwsgi-docs.readthedocs.io/en/latest/HTTP.html?highlight=keep-alive#http-keep -vivo. Ad ogni modo, la tua domanda riceve molte richieste separate. – DenisKolodin

+0

@DenisKolodin > ma non è necessario funziona in modalità keep-alive 'wrk' utilizza http/1.1 quindi keep-alive è una modalità predefinita. Lo stesso test con strace e 'ab' mostra' connect' su ogni richiesta. > Ma questo strumento uwsgi potrebbe funzionare in modalità keep-alive per soluzione temporanea se la dimensione del contenuto è nota Non è una soluzione alternativa. È un comportamento documentato) La maggior parte dei framework wsgi imposta il Content-Length corretto. – bav