WSGI是什么伍俘?
WSGI,全稱Web Server Gateway Interface
勉躺,或者Python Web Server Gateway Interface癌瘾,是為Python語(yǔ)言定義的web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。
WSGI 的官方定義是饵溅,the Python Web Server Gateway Interface妨退。從名字就可以看出來(lái),這東西是一個(gè)Gateway,也就是網(wǎng)關(guān)碧注。網(wǎng)關(guān)的作用就是在協(xié)議之間進(jìn)行轉(zhuǎn)換。
WSGI是作為Web服務(wù)器與Web應(yīng)用程序或應(yīng)用框架之間的一種低級(jí)別的接口糖赔,以提升可移植Web應(yīng)開發(fā)的共同點(diǎn)萍丐。WSGI是基于現(xiàn)存的CGI標(biāo)準(zhǔn)而設(shè)計(jì)的。
很多框架都自帶了 WSGI server 放典,比如 Flask逝变,webpy,Django奋构、CherryPy等等壳影。當(dāng)然性能都不好,自帶的 web server 更多的是測(cè)試用途弥臼,發(fā)布時(shí)則使用生產(chǎn)環(huán)境的 WSGI server或者是聯(lián)合 nginx 做 uwsgi 宴咧。
也就是說(shuō),WSGI就像是一座橋梁径缅,一邊連著web服務(wù)器掺栅,另一邊連著用戶的應(yīng)用。但是呢纳猪,這個(gè)橋的功能很弱氧卧,有時(shí)候還需要?jiǎng)e的橋來(lái)幫忙才能進(jìn)行處理。
WSGI的作用
WSGI有兩方:“服務(wù)器”或“網(wǎng)關(guān)”一方氏堤,以及“應(yīng)用程序”或“應(yīng)用框架”一方沙绝。服務(wù)方調(diào)用應(yīng)用方,提供環(huán)境信息鼠锈,以及一個(gè)回調(diào)函數(shù)(提供給應(yīng)用程序用來(lái)將消息頭傳遞給服務(wù)器方)闪檬,并接收Web內(nèi)容作為返回值。
所謂的 WSGI中間件同時(shí)實(shí)現(xiàn)了API的兩方购笆,因此可以在WSGI服務(wù)和WSGI應(yīng)用之間起調(diào)解作用:從WSGI服務(wù)器的角度來(lái)說(shuō)谬以,中間件扮演應(yīng)用程序,而從應(yīng)用程序的角度來(lái)說(shuō)由桌,中間件扮演服務(wù)器为黎。“中間件”組件可以執(zhí)行以下功能:
- 重寫環(huán)境變量后行您,根據(jù)目標(biāo)URL铭乾,將請(qǐng)求消息路由到不同的應(yīng)用對(duì)象。
- 允許在一個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)應(yīng)用程序或應(yīng)用框架娃循。
- 負(fù)載均衡和遠(yuǎn)程處理炕檩,通過(guò)在網(wǎng)絡(luò)上轉(zhuǎn)發(fā)請(qǐng)求和響應(yīng)消息。
- 進(jìn)行內(nèi)容后處理,例如應(yīng)用XSLT樣式表笛质。
常見的WSGI容器
WSGI是一個(gè)同步接口泉沾,所以框架自帶的WSGI是無(wú)法實(shí)現(xiàn)異步的。主流的選擇是Gunicorn和uWSGI妇押。
uWSGI
uWSGI是應(yīng)c編寫的跷究,它是一個(gè)WEB服務(wù)器,實(shí)現(xiàn)的了自有的uwsgi協(xié)議的Web服務(wù)器敲霍。他自帶豐富的組件俊马,其中核心組件包含進(jìn)程管理、監(jiān)控肩杈、IPC等功能柴我,實(shí)現(xiàn)應(yīng)用Web服務(wù)器接口的請(qǐng)求插件支持多種語(yǔ)言和平臺(tái),比如WSGI扩然、Rack艘儒、Lua WSAPI,網(wǎng)關(guān)組件實(shí)現(xiàn)了負(fù)載均衡夫偶、代理和路由組成彤悔。
它啟動(dòng)的命令相對(duì)復(fù)雜一些
簡(jiǎn)單的WSGI應(yīng)用
在項(xiàng)目的目錄下新建一個(gè)blog.py文件
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
可以用 --processes 選項(xiàng)添加更多的進(jìn)程,或者使用 --threads 選項(xiàng)添加更多的線程 (或者可以同時(shí)添加)索守,而且開啟了9191的Web接口晕窑,返回uWSGI的信息,以及不同進(jìn)程和線程的詳細(xì)使用情況卵佛。對(duì)你的應(yīng)用進(jìn)行幾次請(qǐng)求杨赤,然后telnet到端口9191,會(huì)獲得大量有趣的信息
uwsgi --http :9090 --wsgi-file blog.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
以上是http方式截汪,啟動(dòng)后可以直接通過(guò)127.0.0.1:9090 訪問(wèn)
- --http-socket 和--http其實(shí)是完全不同的兩個(gè)選項(xiàng)疾牲。如果想直接裸跑uWSGI,應(yīng)該使用--http衙解,它產(chǎn)生一個(gè)額外的進(jìn)程將請(qǐng)求轉(zhuǎn)發(fā)給Workers阳柔,如果希望他被反向代理(比如和Nginx一起來(lái)用),應(yīng)該使用--http-socket
uwsgi支持多種配置風(fēng)格蚓峦,接下來(lái)使用.ini文件舌剂。新建blog.ini
[uwsgi]
http=:8089
chdir = /home/student/project/newsite/
wsgi-file = /home/student/project/newsite/newsite/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
直接在終端用uwsgi --blog.ini運(yùn)行。
Gunicorn
gunicorn暑椰,是“Green Unicorn”是一個(gè)唄廣泛使用的高性能的Python WSGI UNIX HTTP服務(wù)霍转,具有使用非常簡(jiǎn)單,輕量級(jí)的資源消耗一汽,以及高性能等特點(diǎn)避消。支持Django,paster,wsgi程序岩喷。自動(dòng)管理多個(gè)worker進(jìn)程恕沫。
在裝好gunicorn之后, 我們來(lái)看看gunicorn的hello world。代碼來(lái)自官網(wǎng)纱意,將下面的代碼放到myapp.py中:
def app(environ, start_response):
data = b"Hello, World!\n"
start_response("200 OK", [("Content-Type", "text/plain"),("Content-Length", str(len(data)))])
return iter([data])
然后我們啟動(dòng):gunicorn -w 4 myapp:app

上圖展示了兩個(gè)很重要的信息:
第一:?jiǎn)?dòng)了四個(gè)worker婶溯,這是通過(guò)"-w 4"指定(默認(rèn)為1)
第二:worker的工作模型是sync(默認(rèn))