1. 程式人生 > 其它 >uWSGI和WSGI之間的關係

uWSGI和WSGI之間的關係

一.WSGI 協議

WSGI:是一種協議規範,起到規範引數的作用,就像告訴公路一樣,規定超車靠右行,速度不低於90km/h,等。但這一切都是對雙方進行溝通,比如,重慶到武漢這條高速路,這兒重慶和武漢就各為一端,他們之間的行車規範就按照WSGI規則即可。我們現在需要記住,WSGI溝通的雙方是wsgi server (比如uWSGI) 要和 wsgi application(比如django )

wsgi server (比如uWSGI)實現wsgi協議規範的伺服器我們叫做wsgi伺服器,也就是uWSGI伺服器,wsgi application(比如django )實現wsgi協議的應用,我們叫做wsgi應用,比如Django,Falsk

二.uWSGI

uWGSI:是一個web伺服器,或者wsgi server伺服器,他的任務就是接受使用者請求,由於使用者請求是通過網路發過來的,其中使用者到伺服器端之間用的是http協議,所以我們uWSGI要想接受並且正確解出相關資訊,我們就需要uWSGI實現http協議,沒錯,uWSGI裡面就實現了http協議。所以現在我們uWSGI能準確接受到使用者請求,並且讀出資訊。

現在我們的uWSGI伺服器需要把資訊發給Django,我們就需要用到WSGI協議,剛好uWSGI實現了WSGI協議,所以。uWSGI把接收到的資訊作一次簡單封裝傳遞給Django,Django接收到資訊後,再經過一層層的中介軟體,於是,對資訊作進一步處理,最後匹配url,傳遞給相應的檢視函式,檢視函式做邏輯處理......後面的就不敘述了,然後將處理後的資料通過中介軟體一層層返回,到達Djagno最外層,然後,通過WSGI協議將返回資料返回給uWSGI伺服器,uWSGI伺服器通過http協議將資料傳遞給使用者,這就是整個流程。

這個過程中我們似乎沒有用到uwsgi協議,但是他也是uWSGI實現的一種協議,魯迅說過,存在即合理,所以說,他肯定在某個地方用到了。我們過一會再來討論

我們可以用這條命令:python manage.py runserver,啟動Django自帶的伺服器,具體叫什麼名字,我真不知道(知道的可以留言)。DJango自帶的伺服器(runserver 起來的 HTTPServer 就是 Python 自帶的 simple_server)。

是預設是單程序單多執行緒的,對於同一個http請求,總是先執行一個,其他等待,一個一個序列執行。無法並行。而且django自帶的web伺服器效能也不好,只能在開發過程中使用。於是我們就用uWSGI代替了。但是uWSGI也不夠好,為什麼看下圖。

三.搭配nginx

因為nginx具備優秀的靜態內容處理能力,然後將動態內容轉發給uWSGI伺服器,這樣可以達到很好的客戶端響應。支援的併發量更高,方便管理多程序,發揮多核的優勢,提升效能。這時候nginx和uWSGI之間的溝通就要用到uwsgi協議。

四.總結

django 的併發能力真的是令人擔憂,這裡就使用 nginx + uwsgi 提供高併發

nginx 的併發能力超高,單臺併發能力過萬(這個也不是絕對),在純靜態的 web 服務中更是突出其優越的地方,由於其底層使用 epoll 非同步IO模型進行處理,使其深受歡迎。

做過運維的應該都知道
Python需要使用nginx + uWSGI 提供靜態頁面訪問,和高併發
php 需要使用 nginx + fastcgi 提供高併發
java 需要使用 nginx + tomcat 提供 web 服務

django 原生為單執行緒序,當第一個請求沒有完成時,第二個請求輝阻塞,直到第一個請求完成,第二個請求才會執行。
Django就沒有用非同步,通過執行緒來實現併發,這也是WSGI普遍的做法,跟tornado不是一個概念

官方文件解釋django自帶的server預設是多執行緒
django開兩個介面,第一個介面sleep(20),另一個介面不做延時處理(大概耗時幾毫秒)
先請求第一個介面,緊接著請求第二個介面,第二個介面返回資料,第一個介面20秒之後返回資料
證明django的server是預設多執行緒

啟動uWSGI伺服器
在django專案目錄下 Demo工程名
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
經過上述的步驟測試,發現在這種情況下啟動django專案,uWSGI也是單執行緒,訪問介面需要"排隊"不給uWSGI加程序,uWSGI預設是單程序單執行緒

uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2
processes: 程序數 # processes 和 workers 一樣的效果 # threads : 每個程序開的執行緒數經過測試,介面可以"同時"訪問,uWSGI提供多執行緒

Python因為GIL的存在,在一個程序中,只允許一個執行緒工作,導致單程序多執行緒無法利用多核多程序的執行緒之間不存在搶GIL的情況,每個程序有一個自己的執行緒鎖,多程序多GIL。

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。