【Python】Flash 要上線了,先準備一下威士忌(WSGI)
認識一下 WSGI (備註:發音跟英文的威士忌一樣)
前言
Flask
這個輕量級的框架很適合拿來「快速」建立網頁或是API,也有不少第三方工具可以支援,例如透過 Flask-login
來處理會員登入/登出功能。
不過 Flask
的負載是個考驗,在本地端測試通常沒有問題,但要上線讓多人使用時,心中總是忐忑不安。
Flask 可以直接處理 Request,為什麼需要 WSGI 呢?
Flask
身為一個輕量級的框架,為了讓使用者不需要進行過多設定就能使用,所以已內建較為陽春的 WSGI Server
(Werkzeug
),負責處理 HTTP Request
及 Flask
間資料的轉換。
Flask 官方文件有提到 Werkzeug
過於簡陋,只能算是 WSGI
工具包(Toolkit),所以在處理「短時間多個 Request」時的負載能力不佳,所以如果有較大的流量需求,建議使用額外的 WSGI Server
。
接下來讓我們從 Flask
為起點,依序介紹 Application Server
, WSGI Server
, Web Server
的概念,以及如何設定服務,提高 Flask
的負載率。
Application Server
常見的 Flask
, Django
框架都屬於這個層級,主要負責:
接受客製化的Request,執行程式碼後,回傳客製化的Response
WSGI Server
用來處理 WSGI
協定的伺服器
WSGI 是一種「協定」,全名是 Python Web Server Gateway Interface
定義 HTTP Request 如何與 Application Server 互動
可以將 WSGI Server
理解成處理 HTTP Request
與 Python 可理解的 Input/Output
的中繼站(Middleware)。
所有支援 WSGI
協定的都可以稱為 WSGI Server
,現在比較常見的是 gunicorn
與 uwsgi
。
Web Server
放在 WSGI Server
前方的 Web Server
,常見的 Apache
, Nginx
都是屬於 Web Server
的範疇,它的功能有下列:
靜態檔案快取
透過 Http Header 讓瀏覽器知道要將「大型靜態文件」暫存在使用者的瀏覽器,降低重複造訪時的讀取時間
負載平衡(Load Balancer)
當流量太高時,單靠一台 Server 不足以負載,會同時有多台 Server 提供服務,Web Server 會扮演門神,將 Requset 指引到該去的地方
反向代理
隱藏真正的 Server 位置,對於使用者來說,所有 Request 都是同一台 Server 在處理 (Web Server),不需要也不會知道背後真正處理的 Server (Application Server) 是哪一台
統整
- Application Server
- 代表服務:
Flask
,Django
- 特色: 負責處理商業邏輯
- 代表服務:
- WSGI Server
- 代表服務:
gunicorn
,uwsgi
- 特色:根據
WSGI
協定,負責「HTTP Request」和「Application Server 能理解的內容」之間的轉換
- 代表服務:
- Web Server
- 代表服務:
Nginx
,Apache
- 特色:靜態檔案快取、負載平衡、反向代理
- 代表服務: