WSGI
全稱:Web Server Gateway Interface 翻譯過來就是Web服務(wù)器網(wǎng)關(guān)接口;WSGI是一個(gè)規(guī)范協(xié)議,定義了Web服務(wù)器如何與Python應(yīng)用程序進(jìn)行交互,使得使用Python寫的Web應(yīng)用程序可以和Web服務(wù)器對(duì)接起來。
在WSGI中定義了兩個(gè)角色,Web服務(wù)器端稱為server或者gateway,應(yīng)用程序端稱為application或者framework(因?yàn)閃SGI的應(yīng)用程序端的規(guī)范一般都是由具體的框架來實(shí)現(xiàn)的)。
要使用WSGI,需要分別實(shí)現(xiàn)server角色和application角色。
Application端的實(shí)現(xiàn)一般是由Python的各種框架來實(shí)現(xiàn)的,比如Django, Flask等,一般開發(fā)者不需要關(guān)心WSGI的實(shí)現(xiàn),框架會(huì)會(huì)提供接口讓開發(fā)者獲取HTTP請(qǐng)求的內(nèi)容以及發(fā)送HTTP響應(yīng);
Server端的實(shí)現(xiàn)會(huì)比較復(fù)雜一點(diǎn),這個(gè)主要是因?yàn)檐浖軜?gòu)的原因。一般常用的Web服務(wù)器,如Apache和nginx,都不會(huì)內(nèi)置WSGI的支持,而是通過擴(kuò)展來完成。比如Apache服務(wù)器,會(huì)通過擴(kuò)展模塊mod_wsgi來支持WSGI。Apache和mod_wsgi之間通過程序內(nèi)部接口傳遞信息,mod_wsgi會(huì)實(shí)現(xiàn)WSGI的server端、進(jìn)程管理以及對(duì)application的調(diào)用。Nginx上一般是用proxy的方式,用nginx的協(xié)議將請(qǐng)求封裝好,發(fā)送給應(yīng)用服務(wù)器,比如uWSGI或者Gunicorn,應(yīng)用服務(wù)器會(huì)實(shí)現(xiàn)WSGI的服務(wù)端、進(jìn)程管理以及對(duì)application的調(diào)用。
WSGI描述了Server與Application之間通信的規(guī)范,簡單來說,WSGI規(guī)范了以下幾項(xiàng)內(nèi)容:
WSGI協(xié)議主要包括server和application兩部分,server負(fù)責(zé)接受客戶端請(qǐng)求并進(jìn)行解析,然后將其傳入application,application處理請(qǐng)求并將響應(yīng)頭和正文返回server(嚴(yán)格說來,還有一個(gè)模塊叫做中間件middleware,但中間件也同樣使用上述兩種接口進(jìn)行通訊)
- 從server的角度來說,其主要工作是解析http請(qǐng)求,生成一個(gè)environ字典并將其傳遞給可調(diào)用的application對(duì)象;另外,server還要實(shí)現(xiàn)一個(gè)start_response函數(shù),其作用是生成響應(yīng)頭,start_response作為參數(shù)傳入application中并被其調(diào)用
- 從application的角度來說,它應(yīng)當(dāng)是一個(gè)可調(diào)用的對(duì)象(實(shí)現(xiàn)了call 函數(shù)的方法或者類),它接受兩個(gè)參數(shù):environ和start_response,其主要作用就是根據(jù)server傳入的environ字典來生成一個(gè)“可迭代的”http報(bào)文并返回給server

調(diào)用的結(jié)果會(huì)被封裝成HTTP響應(yīng)后再發(fā)送給客戶端。
uwsgi
它是一個(gè)二進(jìn)制協(xié)議,可以攜帶任何類型的數(shù)據(jù)。一個(gè)uwsgi分組的頭4個(gè)字節(jié)描述了這個(gè)分組包含的數(shù)據(jù)類型。
uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用于在uWSGI服務(wù)器與其他網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)通信;
uWSGI
uWSGI是一個(gè)web服務(wù)器,實(shí)現(xiàn)了WSGI協(xié)議、uwsgi協(xié)議、http協(xié)議等

要注意 WSGI / uwsgi / uWSGI 這三個(gè)概念的區(qū)分。
- WSGI是一種通信協(xié)議。
- uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用于在uWSGI服務(wù)器與其他網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)通信。
- 而uWSGI是實(shí)現(xiàn)了uwsgi和WSGI等協(xié)議的Web服務(wù)器