摘要:是一個(gè)字典,包含了客戶端請(qǐng)求的信息,如請(qǐng)求的首部,方法等信息,可以認(rèn)為是請(qǐng)求上下文一個(gè)用于發(fā)送響應(yīng)狀態(tài)響應(yīng)頭的回調(diào)函數(shù)。
1.Python web開發(fā)你需要理解的一些服務(wù)器概念
??前幾日在生產(chǎn)服務(wù)器上部署Python web.py的一個(gè)項(xiàng)目,發(fā)現(xiàn)自己對(duì)服務(wù)器的一些概念不是很明白,遂查資料看了一會(huì),特此做出個(gè)人的一些算是筆試的總結(jié)吧,以便之后可以回顧
2.WSGI??全稱是Web Server Gateway Interface,WSGI不是服務(wù)器,也不是API或者Python的什么模塊之類的,它只是一種Python web的一種規(guī)范,類似于Java web里面的servlet規(guī)范,WSGI規(guī)范定義了web應(yīng)用(web框架)與web服務(wù)器之間交互的接口,約定了WSGI server怎么去調(diào)用web應(yīng)用程序類或者函數(shù),web應(yīng)用程序需要符合什么樣的規(guī)范。而下面說的uWSGI就是一種支持WSGI規(guī)范的服務(wù)器,或者你可以將uWSGI理解為一種支持WSGI規(guī)范的容器,所以我們可以將web應(yīng)用部署到uWSGI中,然后當(dāng)它接受請(qǐng)求時(shí),就會(huì)按照WSGI定義的接口回調(diào)web應(yīng)用來處理請(qǐng)求。
??WSGI定義了兩種角色,分別為server端(或者gateway端)和application端(或者framework端),需要server端和application端都支持WSGI,一般而言server端是uWSGI,application端是一個(gè)可調(diào)用對(duì)象(callable object),可調(diào)用對(duì)象可以是類、方法或者可調(diào)用的實(shí)例,這個(gè)對(duì)象接受兩個(gè)參數(shù)environ(請(qǐng)求的環(huán)境變量)和start_response(回調(diào)函數(shù))。
environ是一個(gè)字典,包含了客戶端請(qǐng)求的信息,如 HTTP 請(qǐng)求的首部,方法等信息,可以認(rèn)為是請(qǐng)求上下文
start_response一個(gè)用于發(fā)送HTTP響應(yīng)狀態(tài)(HTTP status )、響應(yīng)頭(HTTP headers)的回調(diào)函數(shù)。在返回內(nèi)容之前必須先調(diào)用這個(gè)回調(diào)函數(shù)
def simple_app(environ, start_response): """ docstring, it"s just a test application """ status = "200 OK" response_headers = [("Content-type", "text/html")] start_response(status, response_headers) return ["Hello World"]
??上面的回調(diào)函數(shù)的作用是讓W(xué)SGI server返回響應(yīng)的首部和HTTP狀態(tài)碼,這個(gè)函數(shù)必須有兩個(gè)參數(shù),第一個(gè)是狀態(tài)碼,第二個(gè)是響應(yīng)的首部元組組成的列表,并且回調(diào)函數(shù)設(shè)置狀態(tài)碼和首部需要在return響應(yīng)HTTP body之前執(zhí)行。
??值得一說的是,return返回的響應(yīng)信息應(yīng)該是一個(gè)可迭代對(duì)象,上面的例子中將字符串放在了列表里面,如果直接返回字符串,會(huì)導(dǎo)致WSGI服務(wù)器對(duì)字符串進(jìn)行迭代而影響速度。
??是一個(gè)web服務(wù)器,實(shí)現(xiàn)了WSGI協(xié)議、uwsgi協(xié)議、http協(xié)議等
4 UWSGI??一種規(guī)范,或者說是一種通信協(xié)議,主要用在代理服務(wù)器(如Nginx)與uWSGI服務(wù)器之間的通信,而WSGI主要是用在uWSGI服務(wù)器和應(yīng)用程序之間的通信。
5 請(qǐng)求流程首先nginx 是對(duì)外的服務(wù)接口,外部瀏覽器通過url訪問nginx;
nginx 接收到瀏覽器發(fā)送過來的http請(qǐng)求,將包進(jìn)行解析,分析url,如果是靜態(tài)文件請(qǐng)求就直接訪問用戶給nginx配置的靜態(tài)文件目錄,直接返回用戶請(qǐng)求的靜態(tài)文件。如果不是靜態(tài)文件,而是一個(gè)動(dòng)態(tài)的請(qǐng)求,那么nginx就將請(qǐng)求轉(zhuǎn)發(fā)給uWSGI,uWSGI接收到請(qǐng)求之后將包進(jìn)行處理,處理成WSGI可以接受的格式,根據(jù)請(qǐng)求調(diào)用應(yīng)用程序的某個(gè)文件,某個(gè)文件的某個(gè)函數(shù),最后處理完將返回值再次交給uWSGI,uWSGI將返回值進(jìn)行打包,打包成UWSGI能夠接收的格式,并轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給瀏覽器.
6 小問題從上面可以看出,Nginx這一層并不是必須的,uWSGI服務(wù)器完全可以完成整個(gè)和瀏覽器的交互,但是需要考慮下面的情況
安全問題,程序不能直接被瀏覽器訪問到,而是通過nginx,nginx只開放某個(gè)接口,uWSGI本身是內(nèi)網(wǎng)接口,這樣運(yùn)維人員在nginx上加上安全性的限制,可以達(dá)到保護(hù)程序的作用
負(fù)載均衡問題,一個(gè)uWSGI很可能不夠用,即使開了多個(gè)work也是不行,畢竟一臺(tái)機(jī)器的cpu和內(nèi)存都是有限的,有了nginx做代理,一個(gè)nginx可以代理多臺(tái)uWSGI完成uWSGI的負(fù)載均衡
靜態(tài)文件問題,用django或是uWSGI這種東西來負(fù)責(zé)靜態(tài)文件的處理是很浪費(fèi)的行為,而且他們本身對(duì)文件的處理也不如nginx好,所以整個(gè)靜態(tài)文件的處理都直接由nginx完成,靜態(tài)文件的訪問完全不去經(jīng)過uWSGI以及其后面的東西。
參考文章:
python nginx+uwsgi+WSGI 處理請(qǐng)求詳解
Nginx + uWSGI + Webpy配置&原理.md
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/44543.html
摘要:目前就職于,他在各種演講研討會(huì)和開發(fā)者大會(huì)上積極推廣測(cè)試驅(qū)動(dòng)開發(fā)。問很多敏捷教練都表示訓(xùn)練新人做測(cè)試驅(qū)動(dòng)開發(fā)是一件辛苦而進(jìn)度緩慢的事,并且收益也不是很大。首先是開發(fā)的對(duì)話式風(fēng)格。第一個(gè)問題就是測(cè)試套件的速度。 Harry J.W. Percival目前就職于PythonAnywhere,他在各種演講、研討會(huì)和開發(fā)者大會(huì)上積極推廣測(cè)試驅(qū)動(dòng)開發(fā)(TDD)。他在利物浦大學(xué)獲得計(jì)算機(jī)科學(xué)碩士學(xué)...
摘要:目前就職于,他在各種演講研討會(huì)和開發(fā)者大會(huì)上積極推廣測(cè)試驅(qū)動(dòng)開發(fā)。問很多敏捷教練都表示訓(xùn)練新人做測(cè)試驅(qū)動(dòng)開發(fā)是一件辛苦而進(jìn)度緩慢的事,并且收益也不是很大。首先是開發(fā)的對(duì)話式風(fēng)格。第一個(gè)問題就是測(cè)試套件的速度。 Harry J.W. Percival目前就職于PythonAnywhere,他在各種演講、研討會(huì)和開發(fā)者大會(huì)上積極推廣測(cè)試驅(qū)動(dòng)開發(fā)(TDD)。他在利物浦大學(xué)獲得計(jì)算機(jī)科學(xué)碩士學(xué)...
摘要:它需要將近美元才能買到,但是你可以下載免費(fèi)的和版本。在需要花費(fèi)美元來開始你的學(xué)習(xí),將會(huì)有超過頁(yè)的內(nèi)容和個(gè)多小時(shí)的視頻供你訪問,還包括以后可以免費(fèi)更新。 showImg(https://segmentfault.com/img/bVrJpw); 用Python編寫代碼一點(diǎn)都不難,事實(shí)上它一直被贊譽(yù)為最容易學(xué)的編程語(yǔ)言。如果你準(zhǔn)備學(xué)習(xí)web開發(fā), Python是一個(gè)不錯(cuò)的開始,甚至想做游戲...
摘要:協(xié)議學(xué)習(xí)常見請(qǐng)求方法學(xué)習(xí)和學(xué)習(xí)接口的基本概念接口文檔認(rèn)識(shí)接口測(cè)試用例編寫接口測(cè)試工具使用軟件測(cè)試自動(dòng)化進(jìn)階性能測(cè)試性能測(cè)試的技術(shù)要求很高,不僅僅要對(duì)性能測(cè)試的指標(biāo)測(cè)試分類測(cè)試設(shè)計(jì)有很深刻的理解。 ...
閱讀 6943·2021-09-22 15:08
閱讀 1942·2021-08-24 10:03
閱讀 2453·2021-08-20 09:36
閱讀 1334·2020-12-03 17:22
閱讀 2485·2019-08-30 15:55
閱讀 918·2019-08-29 16:13
閱讀 3064·2019-08-29 12:41
閱讀 3263·2019-08-26 12:12