2012-03-22 110 views
5

是否有可能以某種方式通過uwsgi的保持活動限制?如果不是,持久連接實施的最佳方式是什麼。我使用的是NGiNX + uWSGI(Python),我希望客戶端可以從服務器獲得異步更新。uWSGI保持活動

回答

1

你在談論兩件不同的事情。如果你想要從你的客戶端連接到你的應用程序,你可能想要使用異步模式(通過ugreen,gevent ...)。這樣你就可以維護數千個併發連接。 Keepalive是將多個請求路由到相同連接的一種方式,但這對於您的目的來說毫無用處。相反如果你指的是nginx和uWSGI之間的持久連接,那麼nginx目前沒有辦法達到這種行爲。您可能需要遵循此票:

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

它是關於fastrouter,但將在httprouter也可以應用。但仍處於重大發展階段。

1

不,你不能,因爲uwsgi基於SCGI並在每次請求後關閉套接字。改用FastCGI。

1

如果通過http接收請求,UWSGI支持通過--http-keepalive選項保持活動狀態。通過strace的

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

,我們可以看到connect電話:

/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] 

運行

~$ 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 +++ 

看到了嗎?只有一個連接。

+0

'-c 1'選項設置同時有多少連接處於活動狀態,但不需要在保持活動模式下工作:https://github.com/wg/wrk/blob/91655b5520b524fc0b802ad12220c9dcd546757e/src/http_parser.c#L2123 。 UWSGI爲每個響應添加「Connection:close」。但是如果知道內容的大小,這個'uwsgi'工具可以通過解決方法保持活動狀態:http://uwsgi-docs.readthedocs.io/en/latest/HTTP.html?highlight=keep-alive#http-keep -活。無論如何,你的應用程序會得到很多單獨的請求。 – DenisKolodin 2017-09-07 09:18:29

+0

@DenisKolodin >但在keep-alive模式下不需要工作'wrk'使用http/1.1,因此keep-alive是默認模式。用strace和'ab'進行的相同測試顯示每個請求都有'connect'。 >但是,如果內容大小已知,則此uwsgi工具可以通過解決方法保持活動狀態 這不是解決方法。這是一個記錄的行爲)大多數wsgi框架設置正確的Content-Length。 – bav 2017-09-07 21:34:28