Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。
安装gunicorn
pip install gunicorn
运行gunicorn
$ gunicorn [OPTIONS] 模块名:变量名
模块名是python文件名,可以是完整的路径+python文件名;变量名是python文件中可调用的WSGI(Web Server Gateway ).
直接运行:
#直接运行,默认启动的127.0.0.1::8000
gunicorn 运行文件名称:Flask程序实例名
指定进程和端口号: -w: 表示进程(worker)。 -b:表示绑定ip地址和端口号(bind)。
gunicorn -w 4 -b 127.0.0.1:5001 运行文件名称:Flask程序实例名
我的项目主入口manage.py:
import os
from flask_script import Manager
from flask_migrate import MigrateCommand
from App import create_app
# 环境变量,获取当前Flask环境
env = os.environ.setdefault('FLASK_ENV','devlop')
# 生成app
app = create_app(env)
manager = Manager(app)
# 给manage.py 添加数据库迁移的命令
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
所以运行方式为:
gunicorn -w 4 -b 127.0.0.1:5001 manage:app
gunicron部署flask
不过在production环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx。
下面是supervisor和nginx的配置。
# supervisor_gunicorn.conf
[program:gunicorn_demo]
process_name=%(program_name)s
numprocs=1
priority=901
directory = /opt/gunicorn_demo/
command = /opt/virtualenv/bin/python /opt/virtualenv/bin/gunicorn -c gunicorn_config.py manage:app
autostart = true
startsecs = 20
autorestart = true
startretries = 3
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 10
stdout_logfile = /dev/null
-c gunicorn_config.py, 即是gunicorn本身的配置文件,下面是gunicorn的基本配置,下一章节会详细说明gunicorn的配置项。
import multiprocessing
bind = '127.0.0.1:8000'
workers = multiprocessing.cpu_count() * 2 + 1
backlog = 2048
worker_class = "gevent"
worker_connections = 1000
daemon = False
debug = True
proc_name = 'gunicorn_demo'
pidfile = './logs/gunicorn.pid'
errorlog = './logs/gunicorn.log'
nginx.conf 部分配置
server {
listen 80;
server_name sam_rui.com;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
gunicorn 详细配置
常用配置参数:
- -c CONFIG, --config=CONFIG 指定一个配置文件(py文件).
- -b BIND, --bind=BIND 与指定socket进行绑定.
- -D, --daemon 以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行。
- -w WORKERS, --workers=WORKERS 工作进程的数量。上边提到gunicorn是一个pre-fork worker模式,就是指gunicorn启动的时候,在主进程中会预先fork出指定数量的worker进程在处理请求时,gunicorn依靠操作系统来提供负载均衡,通常推荐的worker数量是:(2 x $num_cores) + 1
- -k WORKERCLASS, --worker-class=WORKERCLASS 工作进程类型. 包括 sync(默认), eventlet, gevent, or tornado, gthread, gaiohttp.
- --backlog INT 最大挂起的连接数.
- --chdir 切换到指定的工作目录.
- --log-level LEVEL 输出error log的颗粒度
- debug
- info
- warning
- error
- critical
- --access-logfile FILE 确认要写入Access log的文件FILE. '-' 表示输出到标准输出.
- --error-logfile FILE, --log-file FILE 确认要写入Error log的文件FILE. '-' 表示输出到标准错误输出.
-c CONFIG : CONFIG,配置文件的路径,通过配置文件启动;生产环境使用;
-b ADDRESS : ADDRESS,ip加端口,绑定运行的主机;
-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1;
-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventlet和gevent并指定
--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。
--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000。
--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改;
-p FILE, --pid FILE:设置pid文件的文件名,如果不设置将不会创建pid文件
--access-logfile FILE : 要写入的访问日志目录
--access-logformat STRING:要写入的访问日志格式
--error-logfile FILE, --log-file FILE : 要写入错误日志的文件目录。
--log-level LEVEL : 错误日志输出等级。
--limit-request-line INT : HTTP请求头的行数的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。
--limit-request-fields INT : 限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,默认情况下,这个值为100,这个值不能超过32768
--limit-request-field-size INT : 限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
-t INT, --timeout INT:超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒;
--daemon: 是否以守护进程启动,默认false;
--chdir: 在加载应用程序之前切换目录;
--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死;一般使用默认;
--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。
--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印;
--check-config :显示现在的配置,默认值为False,即显示。
-e ENV, --env ENV: 设置环境变量
gunicorn配置项可以通过gunicorn的启动命令行中设定,也可以通过配置文件指定。强烈建议使用一个配置文件。
配置文件中的配置
server socket
bind
监听地址和端口。
backlog
服务器中在pending状态的最大连接数,即client处于waiting的数目。超过这个数目, client连接会得到一个error。
建议值64-2048。
worker 进程
workers
worker进程的数量。建议值2-4 x $(NUM_CORES), 缺省为1。
worker_class
worker进程的工作方式。 有 sync, eventlet, gevent, tornado, gthread, 缺省值sync。
threads
工作进程中线程的数量。建议值2-4 x $(NUM_CORES), 缺省值1。
此配置只适用于gthread 进程工作方式, 因为gevent这种使用的是协程工作方式。
worker_connections
客户端最大同时连接数。只适用于eventlet, gevent工作方式。
max_requests
worker重启之前处理的最大requests数, 缺省值为0表示自动重启disabled。主要是防止内存泄露。
max_requests_jitter
抖动参数,防止worker全部同时重启。
timeout
通常设为30。
graceful_timeout
接收到restart信号后,worker可以在graceful_timeout时间内,继续处理完当前requests。
keepalive
server端保持连接时间。
security
limit_request_line
http request line最大字节数。值范围0-8190, 0表示无限制。
limit_request_field
http request中 header字段数的最大值。缺省为100,最大32768。
limit_request_field_size
http request header字段最大字节数。0表示无限制。
调试
reload
当代码有修改时,自动重启workers。适用于开发环境。
reload_extra_files
扩展reload配置,增加templates,configurations等文件修改监控。
spew
跟踪程序执行的每一行。
check_config
检查配置。
server 机制
sendfile
系统底层拷贝数据方式,提供performance。
chdir
在app加载之前,进入到此目录。
daemon
应用是否以daemon方式运行。
raw_env
key=value, 传递环境参数。
pidfile
pid存储文件路径。
worker_tmp_dir
临时工作目录。
user
指定worker进程的运行用户名。
group
指定worker进程运行用户所在组。
umask
gunicorn创建文件的缺省权限。
pythonpath
附加到python path的目录列表。
日志
accesslog
访问日志文件路径。
access_log_format
日志格式。 例如 %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" 。
errorlog
错误日志路径。
loglever
日志级别。debug, info, warning, error, critical.
capture_output
重定向stdout/stderr到error log file。
logger_class
日志实现类。缺省gunicorn.glogging.Logger 。
logconfig
日志配置文件。同python标准日志模块logging的配置。
进程名
proc_name
设置进程名(setproctitle),在ps,top等命令中会看到. 缺省值为default_proc_name配置。