什么是Gunicorn?Gunicorn(綠色獨角獸)是一個用于UNIX的Python WSGI HTTP服務器。這是從Ruby的Unicorn項目移植來的一個前fork工作器模型。Gunicorn服務器廣泛兼容各種web框架,并具有實現簡單,輕量級,高性能等特點。它用來解析HTTP請求的網關服務。它通常是在進行反向代理(如Nginx),或者進行負載均衡(如 AWS ELB)和一個web 應用(比如 Django 或者 Flask)之間。它的運行模型基于pre-fork worker 模型,即就是支持eventlet,也支持greenlet。Gunicorn服務器作為wsgi App的容器,能夠與各種 Web 框架兼容(flask,django 等,得益于gevent 等技術,使用Gunicorn能夠在基本不改變wsgi app 代碼的前提下,大幅度提高 wsgi app的性能。目前Gunicorn最新版本為20.1.0,官方文檔地址:
https://docs.gunicorn.org/en/20.1.0/,如下圖:
Gunicorn 20.1.0官方文檔
靜態資源可以使用nigix,動態資源使用Gunicorn,結構如下圖:
nigix+Gunicorn結構
與uWSGI的性能比較,Gunicorn性能表現突出,如下圖:
與uWSGI的性能比較
Gunicorn特點:
1.本身支持WSGI、web2py、Django和Paster,能和大多數的Python Web框架兼容
2.自動輔助進程管理
3.簡單的Python配置
4.允許配置多個工作環境
5.各種服務器的可擴展鉤子
6.兼容Python 3。 x > = 3.5
7.簡單易上手,輕量級的資源消耗
不過目前gunicorn只能運行在linux環境中,不支持windows平臺。
Python自帶的有個web服務器:wsgiref,Python是單進程的語言,當進程阻塞時,后續請求將排隊處理,因此在生產環境不會使用單進程的Web服務器。Gunicorn的優勢在于,它使用了pre-fork worker模式,也就意味著有一個中心管理進程(master process)用來管理worker進程集合。Master從不知道任何關于客戶端的信息。所有的請求和響應處理都是由worker進程來處理的。Master(管理者)主程序是一個簡單的循環,監聽各種信號以及相應的響應進程。master 管理著正在運行的 worker 集合,通過監聽各種信號比如TTIN,TTOU,and CHLD. TTIN and TTOU 響應的增加和減少worker的數目。CHLD信號表明一個子進程已經結束了,在這種情況下master會自動地重啟失敗的 worker。gunicorn在啟動時,會在主進程中預先fork出指定數量的worker進程來處理請求,gunicorn依靠操作系統來提供負載均衡,推進的worker數量是(2*核數)+1,比如2核的CPU,則worker數量為2*2+1=5。
注:master進程不是管理處理請求的,只負責管理worker進程,比如對worker進程的創建、銷毀、以及根據負載情況增減。(啟動時設置的–workers參數只是worker數,而gunicorn還會創建個master進程。所以,即使配置workers為1,你的app也至少有兩個進程:master負責管理,worker負責處理請求)。
對于Gunicorn來說,gunicorn是WSGI的實現,但同時也自帶web server,能直接對外提供web服務。包括大部分的web app框架,比如Flask和Django也都帶有web server。但是,在生產環境中,一般它們都是各司其職的,Web框架Flask、Django只用于寫app、Gunicorn只用于運行和管理Python web app,而在它們有專門的web server,比如Nginx。
Gunicorn支持多種worker_class工作模式,默認使用sync,具體如下:
1.sync:同步的工作模式, 性能最差
2.eventlet: 協程的工作模式
3.gevent: 協程的工作模式
4.tornado:基于tornado
5.gthread: 多線程模式 利用線程池管理連接
6.gaiohttp:基于aiohttp
安裝Gunicorn,前提需要安裝好Python:
pip install gunicorn
執行:gunicorn -h,執行成功如下圖:
gunicorn執行成功
查看gunicorn的版本如下:
pip show gunicorn
查看gunicorn的版本
如果想讓Gunicorn支持異步workers的話,需要安裝一下三個python包:
pip install greenlet
pip install eventlet
pip install gevent
Apache Superset是一個開源的、現代的、輕量級BI分析工具,能夠對接多種數據源、擁有豐富的圖標展示形式、支持自定義儀表盤,且擁有友好的用戶界面,十分易用。具體可以參考我之前寫的幾篇關于Superset的文章:
1.《一個開源免費高顏值的輕量級商業智能BI平臺Superset 介紹》
2.《開源自助商業分析BI工具SuperSet 1.3.2快速入門(以CSV文件數據)》
3.《開源輕量級BI平臺Superset的SQL編輯器使用指南》
4.《解決開源輕量級BI平臺SuperSet連接SAP Hana數據庫的方案》
5.《開源輕量級BI平臺的Superset的數據集使用指南》
在開發或測試環境下,我們可以用Superset自帶的運行命令:
superset run -h 0.0.0.0 -p 8089
采用此種方式會有一個提示,此方式為非生產環境的部署,如下圖:
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
Superset自帶運行方式
Superset官方建議生產環境默認用gunicorn,gunicorn運行superset如下:
gunicorn -w 5 -k gevent --timeout 120 -b 0.0.0.0:8089 --limit-request-line 0 --limit-request-field_size 0 "superset.app:create_app()" --log-level info --access-logfile logfile.log --log-file error.log --daemon
gunicorn運行superset
--workers:指定進程個數
--timeout:worker進程超時時間,超時會自動重啟
--bind:綁定本機地址,即為Superset訪問地址
--limit_request_line:http request line最大字節數。值范圍0-8190, 0表示無限制
--limit_request_field_size:http request header字段最大字節數。0表示無限制
--worker_class:worker進程的工作方式。 有 sync, eventlet, gevent, tornado, gthread, 缺省值sync
--worker_connections:客戶端最大同時連接數。只適用于eventlet, gevent工作方式
--daemon:后臺運行,如果處于調試階段建議不加
--error-logfile:輸出日志
運行superset成功
登錄superset成功
gunicorn詳細配置可參考官網文檔:
https://docs.gunicorn.org/en/20.1.0/settings.html,這里就不一一介紹了。