我們在部署 flask、django 等 python web 框架時,網上最多的教程就是 nginx+gunicorn/uwsgi 的部署方式,那為什么要這么部署呢,本文就來系統地解釋這個問題。
必備概念
WSGI
這里必須要知道的一個概念,WSGI,web service gateway interface,網絡服務網關接口
它不是 web server,也不是 web application,它是架在 server 和 application 之間的一種協議和規范。
WSGI 的目的就是解耦 web server 和 web application,它包括兩個部分,server 和 application,server 用來接收 web 客戶端的請求,application 用來接收 server 傳來的請求,然后傳給 web server
gunicorn
gunicorn 和 uWsgi 就是實現了 WSGI 協議的 web server;
而 flask、django 等 web 框架也是用的 wsgi 協議,所以需要在 web framework 之前加上 gunicorn 或者 uwsgi
話說回來,python web 框架都自帶 wsgi 服務器,為什么還要 這倆呢?一句話,性能太差,只能用於開發環節,具體不做過多解釋
nginx
nginx 是干什么的呢?參考我的博客 nginx
多層部署的原理
這三者結合起來的效果是什么呢, 我做個簡單比喻
flask webServer + flask app:弱雞版的server,單進程(單 worker),該進程掛掉,web 服務掛掉;無法管理
gunicorn + flask app:多進程(多 worker)server,失敗自動重啟該 worker,看起來不錯哦;簡單管理
nginx + gunicorn + flask app:反向代理,負載均衡,是不是更牛了;
多 nginx + 多 gunicorn + 多 web app:大型多實例 web server,一般還會給 gunicorn 掛上 supervisor;
四種模式詳解
第一種 server 是 web framework 自帶的框架,很容易掛掉,單 worker 工作對多核 cpu 服務器來說是一種浪費;
無法對 worker 進行管理,掛了你不知道,你知道了也只能重啟;
而 gunicorn 是可以對 worker 進行管理的
第二種 server 加上了 gunicorn,gunicorn 相當於是開啟了多個進程,它具有以下優點:
1. 可以調節 worker 的數量,在請求較多時,自動新增 worker,請求較少時,自動減少 worker;
2. 幫我們管理 worker,worker 掛了自動重啟
3. 支持多種配置
4. 各種框架都適用,且部署方法相同
補充:gunicorn 的 管理機制
在管理 worker 上,gunicorn 使用了 pre-fork 模式,即一個 master 進程管理多個 worker 進程,所有請求和響應都由 worker 執行,master 就是一個 loop,監聽 worker 不同進程信號並且作出響應。
比如接受到 TTIN 提升 worker 數量,TTOU 降低運行 Worker 數量。如果 worker 掛了,發出 CHLD, 則重啟失敗的 worker, 同步的 Worker 一次處理一個請求。
看起來不錯,但存在以下問題:
1. gunicorn 如果要實現復雜功能,其配置比較復雜
2. gunicorn 有些功能是無法實現的,比如 訪問控制、限速、限制連接數等
3. gunicorn 不支持 https,當然高版本支持,但是不如 nginx
4. gunicorn 不支持 http1.1
5. gunicorn 無法扛住巨大的並發量
第三種 server 加上 nginx,只為更加高效更加健壯的 web 服務,nginx 的作用
1. 負載均衡:有效的調度 request,而 gunicorn 雖然是多進程,但是沒不能 主動地 對 request 進行調度
2. 動靜分離:經過配置后,nginx 可以直接處理靜態請求,而無需經過 python web 服務器,這一點 gunicorn 沒有
3. 緩存 request 和 response:web 請求包含各種瀏覽器和各種網絡,故 http 請求的發起是一個比較慢的過程,而 gunicorn 需要等待整個請求結束,才處理該請求,並且等 web server 接收完這個請求后,才繼續下一個;
nginx 可以緩存客戶端的請求,收完整個請求后,轉發給 gunicorn,等 gunicorn 返回 response 后,再轉發給客戶端;
這是 nginx 擅長,而 gunicorn 不擅長
第四種 server 可以通過 nginx 實現 多后端、跨語言后端等 高可用 的負載均衡 web 服務器
總結
只做適合的事,沒有絕對的誰只能做什么事;
nginx 功能強大,適合做管理,適合大規模的 web
gunicorn 多進程,充分利用服務器資源,可以支持一些並發量不大的web
總圖
參考資料:
https://zhuanlan.zhihu.com/p/36268647 WSGI及gunicorn指北(一)
https://www.zhihu.com/question/297267614/answer/505683007 nginx和gunicorn和flask的關系?
https://www.zhihu.com/question/38528616