web服務器和web應用(框架)的關系梳理,兼談nginx、wsgi、uWSGI、uwsgi、django。


 WEB應用的訪問流程

目前的web應用程序都是基於B(客戶端-瀏覽器) / S(web服務器+web應用[框架])結構

#模擬一個客戶端瀏覽器訪問web服務器的過程

1.用戶在瀏覽器中輸入訪問地址,也就是提供web應用服務的服務器地址。

a) 瀏覽器本質上是一個socket客戶端程序;

b) 服務器本質上是一個隨時等待客戶端來訪問連接的socket服務端程序,它會根據客戶端的請求進行響應。

c) socket就是網絡上應用程序之間進行通信的一套機制。

2.web服務器接到客戶端的訪問請求后,會轉發給web應用程序[框架]對請求進行處理,web應用程序[框架]把處理結果返回,web服務器再返回給用戶瀏覽器。

 

 

            a) web服務器本質上是一個隨時等待客戶端來訪問連接的socket服務端程序,它會根據客戶端的請求進行響應。

    b) 在python開發的web應用中,常用的web服務器包括Nginx+uWSGI(組合使用)    

Nginx: 只是一個靜態文件服務器或者http請求轉發器,nginx實現了uwsgi協議,
通過uwsgi協議將請求轉發給uWSGI,它實現了一部分web服務器功能。
Nginx擅長高並發,靜態文件,Proxy,gzip壓縮等等。
Nginx+uWSGI組合中,Nginx負責處理靜態資源,
動態請求轉給uWSGI調用Python來完成。

uWSGI: 是一個完整的Web服務器,它實現了WSGI協議、uwsgi、http等協議。如果使用Nginx+uWSGI組合,uWSGI就是實現了WSGI的一個中間件。

Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。
nginx是不能直接部署python web的,因為nginx不支持WSGI規范。 當然nginx也可以實現,不過術業有專攻,nginx沒有做。 
uWSGI是實現了WSGI接口的,一個完整的http server,可以直接用來部署Python Web的,但為什么還需要Nginx呢?
因為Nginx擅長高並發,靜態文件,gzip壓縮等,這些功能是uWSGI不具備的。
如果你的網站訪問量不大,可以只用uWSGI,完全不需要用Nginx。
所以現在流行的使用方法是Nginx
+uWSGI (如下圖),Nginx來完成Proxy,靜態文件服務等,動態請求轉給uWSGI調用Python來完成。
Nginx與uWSGI通過uwsgi(全部小寫)協議來完成,uwsgi是一個二進制協議允許uWSGI與Nginx等應用服務器交互。

 

 

 

    c) WSGI、uwsgi協議     

WSGI(Web Server Gateway Interface):是Python應用程序或框架和Web服務器之間的一種接口,定義web server如何轉發請求到Python寫的應用中。
就像Java 的servlet API,這樣只要實現接口的web server都可以調用遵守此接口的任何Python應用。
WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然。

WSGI是一個Web服務器(如nginx,uWSGI等服務器)與web應用(如用Django、Flask框架寫的程序)通信的一種規范。
WSGI 接口有服務端和應用端兩部分,服務端也可以叫網關端,應用端也叫框架端 服務端調用一個由應用端提供的可調用對象。如何提供這個對象,由服務端決定。
例如某些服務器或者網關需要應用的部署者寫一段腳本,以創建服務器或者網關的實例,並且為這個實例提供一個應用實例。
另一些服務器或者網關則可能使用配置文件或其他方法以指定應用實例應該從哪里導入或獲取。
WSGI 對於 application 對象有如下三點要求: 必須是一個可調用的對象 接收兩個必選參數environ、start_response。
返回值必須是可迭代對象,用來表示http body。
WSGI協議主要包括server和application兩部分: WSGI server負責從客戶端接收請求,將request轉發給application,將application返回的response返回給客戶端;
WSGI application接收由server轉發的request,處理請求,並將處理結果返回給server。
application中可以包括多個棧式的中間件(middlewares),這些中間件需要同時實現server與application,
因此可以在WSGI服務器與WSGI應用之間起調節作用:對服務器來說,中間件扮演應用程序,對應用程序來說,中間件扮演服務器。
WSGI協議其實是定義了一種server與application解耦的規范,
即可以有多個實現WSGI server的服務器,也可以有多個實現WSGI application的框架,那么就可以選擇任意的server和application組合實現自己的web應用。
例如uWSGI和Gunicorn都是實現了WSGI server協議的服務器,Django,Flask是實現了WSGI application協議的web框架,可以根據項目實際情況搭配使用。

 

 

 

     

uwsgi:uwsgi協議是uWSGI服務器單獨使用的協議。
它是一個二進制協議,可以攜帶任何類型的數據。
一個uwsgi分組的頭4個字節描述了這個分組包含的數據類型。
uwsgi通過將消息分片的方式,可以在一個socket上並發傳輸多個請求。
這樣就在fastcgi減輕后端壓力好處的基礎上,解決了fastcgi一個連接上一次只能傳輸一個請求的問題。
熟悉HTTP2.0的話會發現這個分片機制跟HTTP2.0很像。

#不用Nginx,uWSGI也可以單獨作為web服務器使用,流程如圖。

 

 

 

 總結:web服務器和web應用(框架)的關系

1.web 服務器 和 web 應用[框架],分工不同,職責不同(web 服務器專注於接收並解析請求以調用的方式將請求的內容傳web框架),缺一不可,可以說它們是兩個組件,共同協作才能實現web網頁的訪問。

2.web服務器端程序有Nginx+uWSGI的組合使用,如訪問量少可單獨使用uWSGI。

3.web應用(框架)有python開發的應用,或者使用python框架django、flask、Tornado等開發的應用。

4.用戶瀏覽器,通過訪問web服務器獲取web應用(框架)提供的后台服務。下面用三個圖反復描述他們之間的關系。

 

 

圖一

 

 

 

圖二

 

 圖三

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM