Flask+uWSGI+Nginx模型

Web服務器層

Web服務器主要是接收 HTTP 請求並返回響應。常見的 web服務器有 Nginx,Apache,IIS等。在上圖1的三層結構中,web服務器是最先接收用戶請求的,並將響應結果最終返回給用戶。

WSGI層

WSGI 是一種規範/協議,其全稱爲 the Python Web Server Gateway Interface,定義了 web服務器和 web應用之間的接口規範。

下面的代碼展示了 web服務器是如何與 web應用組合在一起的

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

上述代碼就是一個完整的 WSGI 應用,當一個支持 WSGI 的 web服務器接收到客戶端的請求後,便會調用這個 application 方法。WSGI 層並不需要關心 env, start_response 這兩個變量是如何實現的。

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

  • uwsgi:是uWSGI服務器的獨佔通信協議,用於定義傳輸信息的類型。其與WSGI協議是兩種東西,據說該協議是fcgi協議的10倍快。

  • uWSGI:uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。

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(port=5000)

以上簡單的幾行代碼,就創建了一個 web應用程序對象 app。 app 監聽機器所有 ip 的 8080 端口,接受用戶的請求連接。

對於 web框架的使用者來說,只需要關心如何實現業務的邏輯即可,他們並不關心如何接收 HTTP 請求,也不關心如何將請求路由到具體方法處理並將響應結果返回給用戶。

Nginx,uWSGI,Flask 之間的對話

  1. Nginx:Hey,uWSGI,我剛收到了一個請求,我需要你作些準備,然後由Flask來處理這個請求。

  2. uWSGI:OK,Nginx。我會設置好環境變量,然後將這個請求傳遞給Flask處理。

  3. Flask:Thanks uWSGI!給我一些時間,我將會把請求的響應返回給你。

  4. uWSGI:Flask,那我等你。

  5. Flask:Okay,我完成了,這裏是請求的響應結果,請求把結果傳遞給Nginx。

  6. uWSGI:Good job!Nginx,這裏是響應結果,已經按照要求給你傳遞回來了。

  7. Nginx:Cool,我收到了,我把響應結果返回給客戶端。

更多

獲取更多內容請關注微信公衆號豆志昂揚:

  • 直接添加公衆號豆志昂揚
  • 微信掃描下圖二維碼;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章