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