python web下的伺服器結構——WSGI容器、Nginx、Flask之間的關係

sodawaterer發表於2017-05-09

python web下的應用結構主要為:


從下往上開始介紹:

客戶端:瀏覽器或者app。

web伺服器:Web伺服器是指駐留於因特網上某種型別計算機的程式。當Web瀏覽器(客戶端)連到伺服器上並請求檔案時,伺服器將處理該請求並將檔案傳送到該瀏覽器上,附帶的資訊會告訴瀏覽器如何檢視該檔案(即檔案型別)。伺服器使用HTTP(超文字傳輸協議)進行資訊交流,這就是人們常把它們稱為HTTP伺服器的原因。

嚴格意義上Web伺服器只負責處理HTTP協議,用於處理靜態頁面的內容。而動態內容需要通過WSGI介面交給應用伺服器去處理。
Web伺服器包括Nginx,Apache,IIS等。而優秀的web伺服器在接收http請求時,還可以做負載均衡和反向代理等工作。

WSGI容器:常見的WSGI容器有Gunicorn,uWSGI等。web框架和web伺服器之間需要通訊,這時候需要設計一套雙方都遵守的藉口。PEP3333指出,WSGI(Web Server Gateway Interface)是WEB伺服器和web框架或web應用之間建立的一種簡單通用的介面規範。有了wsgi這份介面規範,在web開發的過程中,能更加自由的選擇伺服器端和框架;在伺服器端和框架的開發過程能夠分離開來,不用過多的考慮雙方具體的實現,使得伺服器端和框架開發者能夠專心自己領域的開發工作。而WSGI容器就是根據這套介面寫出來的。WSGI容器的作用就是根據web伺服器傳遞而來的引數構建一個讓WSGI應用成功執行的環境,例如request,而且還得把WSGI應用上處理好的結果返回給web伺服器。此外WSGI容器也叫應用伺服器。

注: 一般應用伺服器都整合了web伺服器,主要是為了除錯方便,出於效能和穩定性考慮,並不能在生產環境中使用。

web框架:作用主要是方便我們開發 web應用程式,HTTP請求的動態資料就是由 web框架層來提供的。常見的 web框架有Flask,Django,Tornado等,而Tornado不光是一個web框架,還實現了WSGI容器的功能。


這裡做個補充記錄:

都知道Flask是一個web框架,而且Flask是基於werkzeug開發的,那werkzeug是什麼呢?

Werkzeug是一個WSGI工具包,他可以作為一個Web框架的底層庫。這裡稍微說一下, werkzeug 不是一個web伺服器,也不是一個web框架,而是一個工具包,官方的介紹說是一個 WSGI 工具包,它可以作為一個 Web 框架的底層庫,因為它封裝好了很多 Web 框架的東西,例如 Request,Response 等等。使用它可以減輕web框架開發工作量。我看過werkzeug的原始碼後發現,werkzeug也實現了WSGI容器的功能,而且利用python/http/server.py庫實現了一個簡易的http伺服器。因此在除錯的時候可以直接使用app.run()把伺服器給執行起來。


相關文章