如何使用Nginx, gunicorn與supervisor 進行搭配,來部署一個Flask App
分別先講一下這四個工具每個的工作:
Process 是 OS 分配資源的對象
Thread 是 OS 分配 CPU 時間的對象
WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是為 Python 語言定義的 Web 伺服器和 Web 應用程式或框架之間的一種簡單而通用的介面,也就是幫助協議之間進行轉換。
WSGI 是作為 Web 伺服器與 Web 應用程式或應用框架之間的一種低階別的介面,以提升可移植 Web 應用開發的共同點。WSGI 是基於現存的 CGI 標準而設計的。
很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。當然效能都不好,自帶的 web server 更多的是測試用途,釋出時則使用生產環境的 WSGI server或者是聯合 nginx 做 uwsgi 。
也就是說,WSGI就像是一座橋樑,一邊連著web伺服器,另一邊連著使用者的應用。但是呢,這個橋的功能很弱,有時候還需要別的橋來幫忙才能進行處理。
WSGI定義與協調Python程序與請求之間的接口,常用的WSGI容器有Gunicorn和uWSGI,而Gunicorn更加快捷。
Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP Server for UNIX.
Flask是一個基於Python的Web開發微框架,借助Web框架,我們就不用關心請求,響應這些底層的實現,而專注於業務的實現~ 而Flask相比於其他框架更加輕量,自由度更高。
Nginx 是一個異步框架的Web服務器,我將它部署在Gunicorn前面,通過反向代理連接. 其實不加Nginx也是可以的,但是加上Nginx有更多好處, 例如 靜態文件支持,負載均衡等等。
–worker視為Process,所以資源是各自獨立的。因此,修改A變數時,並不會影響另外一個worker的變數A。若想同步修改,則只能透過存到資料庫,透過通知或需要的時候進行讀取並修改。否則,一個worker拚到底啊!
當 gunicorn worker type 用 gthread 時,可額外加參數 –thread 指定每個 process 能開的 thread 數量,此時 concurrency 的上限為 worker 數量乘以給各 worker 能開的 thread 數量。
WSGI詳解
部署簡單介紹 I
部署簡單介紹 II
Gunicorn配置
Program/Process/Thread 差異
淺談 Gunicorn 各個 worker type 適合的情境