一般服務器程序分爲web服務器和應用程序服務器。web服務器是用於處理HTML文件,讓客戶能夠經過瀏覽器進行訪問,主流的web服務器有Apache、IIS、Nginx、lighthttpd等。應用服務器處理業務邏輯,好比使用Python的Django、flask寫的程序。一般來自客戶端瀏覽器的請求被web服務器截獲,若是是靜態請求,則如Nginx會本身作處理,若是是動態請求,則會拋給後端應用服務器來處理。因而如何在web服務器與應用服務器之間進行通訊成了主要問題,這就引出瞭如下三種處理的接口:CGI、FastCGI、WSGI。python
通用網關接口(Comman Gateway Interface)描述了客戶端和服務器程序之間傳輸數據的一種標準,可讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的應用程序請求數據。CGI獨立於任何語言,CGI程序能夠是任何腳本語言或徹底獨立編程語言實現,只要這個語言能夠在這個系統上運行。Unix shell、Python、Ruby、PHP、Perl、C/C++和VB均可以用來編寫CGI程序。最初CGI是在1993年由美國國家超級電腦應用中心爲NCSA HTTPd web服務器開發的。這個web服務器使用了Unix shell環境變量來保存從web服務器傳遞出去的參數,而後生成一個運行CGI的獨立的進程。CGI的處理流程以下圖所示:
nginx
CGI使外部程序與web服務器之間交互成爲可能。CGI程序運行在獨立的進程中,並對每一個web請求創建一個進程,這種方法很是容易實現,但效率不好,難以擴展。面對大量請求,進程的大量創建和消亡使操做系統性能大大降低,此外,因爲地址空間沒法共享,業限制了資源重用。web
快速通用網關接口(Fast Comman Gateway Interface)是通用網關接口(CGI)的改進,描述了客戶端和服務器程序之間傳輸數據的一種標準。FastCGI致力於減小web服務器與CGI程序之間互動的開銷,從而使服務器能夠同時處理更多的web請求。與爲買個請求建立一個新的進程不一樣,FastCGI使用持續的進程來處理一連串的請求。這些進程由FastCGI進程管理器管理,而不是web服務器。
shell
當進來一個請求時,web服務器把環境變量和這個頁面請求經過Unix domain socket(都位於同一物理服務器)或者一個IP socket(FastCGI部署在其餘物理服務器)傳遞給FastCGI進程。
數據庫
因爲FastCGI程序不須要不斷地產生新進程,能夠大大下降服務器的壓力而且產生較高的應用效率。它的速度效率至少要比CGI技術提升5倍以上。它還支持分佈式部署,即FastCGI程序能夠在web服務器之外的主機上運行。
CGI就是所謂的短生存期應用程序,FastCGI就是所謂的長生存期應用程序。FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,不會每次都要花費時間去fork(這是CGI最爲人詬病的fork-and-execute模式)。編程
web服務器網關接口(Python Web Server Gateway Interface)是爲Python語言定製的web服務器和web應用程序或框架之間的一種簡單通用的接口。自從WSGI被開發出來以後,許多其餘語言中也出現了相似接口。WSGI是做爲web服務器與web應用程序或應用框架之間的一種低級別的接口,以提高可移植web應用開發的共同點。WSGI是基於現存的CGI標準而設計的。
WSGI分爲兩個部分:一爲"服務器"或"網關",另外一爲"應用程序"或"應用框架"。在處理一個WSGI請求時,服務器會爲應用程序提供環境資訊及一個回調函數(callback function)。當應用程序完成處理請求後,透過前述的回調函數,將結果回傳給服務器。所謂的WSGI中間件同時實現了API的兩方,所以能夠在WSGI服務和WSGI應用之間起調解做用:從WSGI服務器的角度來講,中間件扮演應用程序,而從應用程序角度來講,中間件扮演服務器。"中間件"組件能夠執行如下功能:flask
之前,如何選擇合適的web應用程序框架成爲困擾Python初學者的一個問題,這是由於,通常而言,web應用框架的選擇將限制可用的web服務器的選擇,反之亦然。那時的Python應用程序一般爲CGI、FastCGI、mod_python中的一個設計,甚至是爲特定web服務器的自定義的API接口而設計的。WSGI沒有官方的實現,由於WSGI更像一個協議。只要遵循這些協議,WSGI應用(application)均可以在任何服務器(server)上運行,反之亦然。WSGI就是Python的CGI包裝,相對於FastCGI是PHP的CGI包裝。
WSGI將web組件分爲三類:web服務器、web中間件、web應用程序,WSGI基本處理模式爲:
後端
一、wsgi server/gateway
wsgi server能夠理解爲一個符合WSGI規範的web server,接收request請求,封裝一系列環境變量,按照wsgi規範調用註冊的wsgi app,最後將response返回給客戶端。文字很難理解清楚wsgi server究竟是什麼東西,以及作些什麼事情,最直觀的方式仍是看wsgi server的實現代碼。以Python自帶的wsgiref爲例,wsgiref是按照wsgi規範實現的一個簡單wsgi server。
瀏覽器
二、wsgi application
wsgi application就是一個普通的callback對象,當有請求到來時,wsgi server會調用這個wsgi app。這個對象接收兩個參數,一般爲environ,start_response。environ就是前面介紹的,能夠理解爲環境變量,跟一次請求相關的全部信息都保存在了這個環境變量中,包括服務器信息,客戶端信息,請求信息。start_response是一個callback函數,wsgi application經過start_response,將response header/status返回給wsgi server。此外這個wsgi app會返回一個迭代器對象,這個迭代器對象就是response body。服務器
三、wsgi middleware
有些功能可能介於服務器程序和應用程序之間,例如,服務器拿到了客戶端請求的URL,不一樣的URL須要交由不一樣的函數處理,這個功能叫URL路由,這個功能就能夠放在兩者中間實現,這個中間層就是middleware。middleware對服務器程序和應用都是透明的,也就是說,服務器程序覺得它就是應用程序,而應用程序覺得它就是服務器。這就告訴咱們,middleware須要把本身假裝成一個服務器,接收應用程序,調用它,同時middleware還須要把本身假裝成一個應用程序,傳給服務器程序。其實不管是服務器程序,middleware仍是應用程序,都在服務端,爲客戶提供服務,之因此把它們抽象成不一樣層,就是爲了控制複雜度,使得每一次都不太複雜,各司其職。
uwsgi旨在爲部署分佈式集羣的網絡應用開發一套完整的解決方案。uwsgi主要面向web及其標準服務,已經成功的應用於多種不一樣的語言。因爲uwsgi的可擴展架構,它可以被無限制的擴展用來支持更多的平臺和語言。目前可使用C,C++和Object-C來編寫插件。項目名稱中的wsgi是爲了向同名的Python web標準表示感謝,由於wsgi爲該項目開發了第一個插件。uwsgi是一個web服務器,它實現了wsgi協議、uwsgi協議、http等協議。uwsgi既不用wsgi協議也不用FastCGI協議,而是自創了一個uwsgi協議,uwsgi協議是一個uWSGI服務器自由的協議,它用於定義傳輸信息的類型,每個uwsgi packet前4字節爲傳輸信息類型描述,它與WSGI相比是兩樣東西,聽說該協議大約是fcgi協議的10倍快。uWSGI主要特色以下: