什么是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,这里就不一一介绍了。