1. 程式人生 > >理解Nginx, WSGI, Flask之間的關係

理解Nginx, WSGI, Flask之間的關係

概覽

之前對 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),這幾者的關係一存存在疑惑。通過查閱了些資料,總算把它們的關係理清了。 
總括來說,客戶端從傳送一個 HTTP 請求到 Flask 處理請求,分別經過了 web伺服器層,WSGI層,web框架層,這三個層次。不同的層次其作用也不同,下面簡要介紹各層的作用。

web伺服器,web框架與WSGI的三層關係

圖1:web伺服器,web框架與 WSGI 的三層關係

Web伺服器層

對於傳統的客戶端 - 伺服器架構,其請求的處理過程是,客戶端向伺服器傳送請求,伺服器接收請求並處理請求,然後給客戶端返回響應。在這個過程中,伺服器的作用是:

  1. 接收請求
  2. 處理請求
  3. 返回響應

Web伺服器是一類特殊的伺服器,其作用是主要是接收 HTTP 請求並返回響應。提起 web伺服器大家都不會陌生,常見的 web伺服器有 Nginx,Apache,IIS等。在上圖1的三層結構中,web伺服器是最先接收使用者請求的,並將響應結果返回給使用者。

Web框架層

Web框架的作用主要是方便我們開發 web應用程式,HTTP請求的動態資料就是由 web框架層來提供的。常見的 web框架有Flask,Django等,我們以 Flask 框架為例子,展示 web框架的作用:

from flask import Flask
app = Flask(__name__)

@app.route('/hello')
def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

以上簡單的幾行程式碼,就建立了一個 web應用程式物件 appapp 監聽機器所有 ip 的 8080 埠,接受使用者的請求連線。我們知道,HTTP 協議使用 URL 來定位資源,上面的程式會將路徑 /hello 的請求交由 hello_world 方法處理,hello_world 返回 ‘Hello World!’ 字串。對於 web框架的使用者來說,他們並不關心如何接收 HTTP 請求,也不關心如何將請求路由到具體方法處理並將響應結果返回給使用者。Web框架的使用者在大部分情況下,只需要關心如何實現業務的邏輯即可。

WSGI層

WSGI 不是伺服器,也不是用於與程式互動的API,更不是真實的程式碼,WSGI 只是一種介面,它只適用於 Python 語言,其全稱為 Web Server Gateway Interface,定義了 web伺服器和 web應用之間的介面規範。也就是說,只要 web伺服器和 web應用都遵守WSGI協議,那麼 web伺服器和 web應用就可以隨意的組合。 
下面的程式碼展示了 web伺服器是如何與 web應用組合在一起的。

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b"Hello World"]
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

方法 application由 web伺服器呼叫,引數envstart_response 由 web伺服器實現並傳入。其中,env是一個字典,包含了類似 HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO 等環境變數。start_response則是一個方法,該方法接受兩個引數,分別是statusresponse_headersapplication方法的主要作用是,設定 http 響應的狀態碼和 Content-Type 等頭部資訊,並返回響應的具體結果。

上述程式碼就是一個完整的 WSGI 應用,當一個支援 WSGI 的 web伺服器接收到客戶端的請求後,便會呼叫這個 application 方法。WSGI 層並不需要關心envstart_response 這兩個變數是如何實現的,就像在 application 裡面所做的,直接使用這兩個變數即可。

值得指出的是,WSGI 是一種協議,需要區分幾個相近的名詞:

  • uwsgi 
    同 wsgi 一樣也是一種協議,uWSGI伺服器正是使用了 uwsgi 協議
  • uWSGI 
    實現了 uwsgi 和 WSGI 兩種協議的web伺服器。注意 uWSGI 本質上也是一種 web伺服器,處於上面描述的三層結構中的 web伺服器層。
  • CGI 
    通用閘道器介面,並不限於 Python 語言,定義了 web伺服器是如何向客戶端提供動態的內容。例如,規定了客戶端如何將引數傳遞給 web伺服器,web伺服器如何將引數傳遞給 web應用,web應用如何將它的輸出如何傳送給客戶端,等等。 
    生產環境下的 web應用都不使用 CGI 了,CGI程序(類似 Python 直譯器)針對每個請求建立,用完就拋棄,效率低下。WSGI 正是為了替代 CGI 而出現的。

說到這,我們基本理清了 WSGI 在 web伺服器與 web框架之間作用:WSGI 就像一條紐帶,將 web伺服器與 web框架連線起來。回到本文的題目,Nginx 屬於一種 web伺服器,Flask屬於一種 web框架,因此,WSGI 與 Nginx、Flask 的作用就不明而喻了。

最後以 Nginx,WSGI,Flask 之間的對話結束本文。 
Nginx:Hey,WSGI,我剛收到了一個請求,我需要你作些準備,然後由Flask來處理這個請求。 
WSGI:OK,Nginx。我會設定好環境變數,然後將這個請求傳遞給Flask處理。 
Flask:Thanks WSGI!給我一些時間,我將會把請求的響應返回給你。 
WSGI:Alright,那我等你。 
Flask:Okay,我完成了,這裡是請求的響應結果,請求把結果傳遞給Nginx。 
WSGI:Good job!Nginx,這裡是響應結果,已經按照要求給你傳遞回來了。 
Nginx:Cool,我收到了,我把響應結果返回給客戶端。大家合作愉快~

相關推薦

如何理解Nginx, WSGI, Flask之間關係

概覽 之前對 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),這幾者的關係一存存在疑惑。通過查閱了些資料,總算把它們的關係理清了。 總括來說,客戶端從傳送一個 HTTP 請求到 Flask 處理請求,分別經過了 web

理解Nginx, WSGI, Flask之間關係

概覽 之前對 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),這幾者的關係一存存在疑惑。通過查閱了些資料,總算把它們的關係理清了。  總括來說,客戶端從傳送一個 HTTP 請求到 Flask 處理請求,分別經過了 web伺服器層,

Nginx, WSGI, Django之間關係

概覽 對 Nginx,WSGI(或者 uWSGI,uwsgi),Django,這幾者的關係一存存在疑惑。通過查閱了些資料,總算把它們的關係理清了。  總括來說,客戶端從傳送一個 HTTP 請求到 Django處理請求,分別經過了 web伺服器層,WSGI層,web框架層,這

nginx uwsgi wsgi django 之間關係

首先nginx 是對外的服務介面,外部瀏覽器通過url訪問nginx, nginx 接收到瀏覽器傳送過來的http請求,將包進行解析,分析url,如果是靜態檔案請求就直接訪問使用者給nginx配

Nginx、uWSGI、Flask之間的關系

__name__ 服務 ima 方便 src 簡要介紹 程序 服務器架構 span 總體來說:客戶端從發送一個HTTP請求到Flask處理請求,分別經過了web服務層,WSGI層,web框架層,這三個層次。不同的層次期作用也不同,下面簡要介紹個層的作用。 1、Web服務器

清晰的理解pg與pgp之間關係

一、前言 首先來一段英文關於PG和PGP區別的解釋: PG = Placement Group PGP = Placement Group for Placement purpose pg_num = number of placement groups mapped to a

nginx uwsgi wsgi 是什麼關係

1 首先nginx 是對外的服務介面,外部瀏覽器通過url訪問nginx, 2nginx 接收到瀏覽器傳送過來的http請求,將包進行解析,分析url,如果是靜態檔案請求就直接訪問使用者給nginx配置的靜態檔案目錄,直接返回使用者請求的靜態檔案, 如果不是靜態檔案,而是一個動態的請

讓你更容易理解java中類之間的6種關係

繼承關係 繼承關係包括子類和父類、子介面和父介面之間兩種繼承關係。用空心三角形和實線表示這種繼承關係。 實現關係 類和介面之間的關係,用空心三角形和虛線表示。 依賴關係 依賴關係:A類會用到B類,這種關係具有偶然性,臨時性。但B類的變化

理解類與類之間關係小結

    首先說明這是自己的一些理解,如果有不對的地方,希望大家指正。(水平有限)組合    首先要說明的是,組合要符合has-a的關係,所謂has-a,舉個例子吧,就像汽車類引擎類,引擎對於汽車來說肯定是必不可少的,這便是has-a的關係。在程式碼中我們來看,首先我們新建一個

初學者對Servlet、JSP及Web容器之間關係理解

Servlet就是一個Java程式,一個Servlet應用程式經常包含一個或者多個Servlet也就是當用戶傳送請求,例如提交表單,那麼需要一個或多個Servlet協同作用,而訪問的jsp頁面也是一個S

Nginx+Uwsgi+Flask在阿裏雲服務器上的部署

warn down 安裝過程 oot 上傳文件 open 移動 gin ica 先說明一下,我用的系統是centos6.8,個人感覺centos的系統配置還是挺簡單的。。。不過存在很多防火墻的問題,下邊一步步來說。。。。 centos上應該是默認已經安裝了Python2.6

深刻理解NginxNginx完整安裝

特性 一個 kconfig tool nginx腳本 roo filter com directive 1. Nginx安裝 1.1預先準備 CentOS系統下,安裝Nginx的庫包依賴。安裝命令例如以下: sudo yum groupinstall "Develo

java 深入理解內部類以及之間的調用關系

per enc style .cn 自己 對象 說明符 我們 正常 什麽是內部類 內部類是指在一個外部類的內部再定義一個類。內部類作為外部類的一個成員,並且依附於外部類而存在的。內部類可為靜態,可用protected和private修飾(而外部類只能使用public和缺省的

gunicorn、nginx部署flask項目,並用supervisor來管理進程

開發 log 練習 修改 後端 block mar com .com 本科的時候做公眾號,開始提供學生教務查詢服務,後端從PHP轉到Python,無論是使用django還是flask,部署都沒PHP那麽方便,每次修改程序完,都是ps ax,然後再kill,再run。emm

轉載:2.2.3 配置項的註釋《深入理解Nginx》(陶輝)

href 深入 logs class tps 註釋 配置 blog bsp 原文:https://book.2cto.com/201304/19628.html如果有一個配置項暫時需要註釋掉,那麽可以加“#”註釋掉這一行配置。例如:#pid logs/ngi

轉載:2.2.5 在配置中使用變量《深入理解Nginx》(陶輝)

依賴 con com 關註 部分 自己 core stat sent 原文:https://book.2cto.com/201304/19630.html 有些模塊允許在配置項中使用變量,如在日誌記錄部分,具體示例如下。log_format main ‘$r

nginx uwsgi flask相關配置

1.3 線程 keep icon ges tar tro pki 獲取 一、安裝Nginx 在 /home/download下下載壓縮包 wget https://nginx.org/download/nginx-1.12.2.tar.gz 解壓縮 tar zxvf ngi

雲效(阿裏雲)流水線 + nginx + uWsgi + flask + python3 基礎環境搭建 --備忘

3.6 分享圖片 fff urn art conf con write sqlite 一、開發環境搭建 1、安裝python3 yum -y groupinstall "Development tools" yum -y install zlib-devel

Ubuntu+Nginx+uWSGI+Flask應用

gen art csdn 完成 進程 logs apt-get virtual style Ubuntu 18.04,Nginx 1.14.0,uWSGI 2.0.17.1,Flask 1.0.2,Python 3.6.5, 多日未更新博客,就是在忙著把自己的Flask

[ARM-Linux開發]深入理解 sudo 與 su 之間的區別

在早前的一篇文章中,我們深入討論了 sudo 命令的相關內容。同時,在該文章的末尾有提到相關的命令 su的部分內容。本文,我們將詳細討論關於 su 命令與 sudo 命令之間的區別。 在開始之前有必要說明一下,文中所涉及到的示例