Gunicorn
(独角兽)是一个高效的Python WSGI(
Web服务器网关接口
) Server,
使用pre-fork worker模式
,和大多数的web框架兼容,并具有
实现简单,轻量级资源消耗,高性能等特点,通常
用它来运行 wsgi application(由我们自己编写遵循WSGI application的编写规范) 或者
wsgi framework
(如Django,Paster),地位相当于Java中的Tomcat。
一、安装Gunicorn
pip install gunicorn
若想让Gunicorn支持异步 workers 的话需要安装一下三个python包
1 easy_install -U greenlet # 安装 greenlet 失败的话,你需要安装sudo apt-get install python-dev
2 easy_install -U eventlet
3 easy_install -U gevent
二、运行Gunicorn
成功安装 gunicorn 之后,有以下三个指令你可以直接使用,用来
启动 gunicorn 运行 wsgi application或者 wsgi frameworks
2.1 gunicorn
Gunicorn server的 最基本的命令,直接用来 运行最基本的 wsgi application 。用法: gunicorn [OPTIONS] APP_MODULE参数:OPTIONS:可选参数
-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 --timeout:超时时间 --threads=2 : 指定每个进程开启的线程数 --reload : 代码更新时将重启工作,默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。 --preload : 在工作进程被复制(派生)之前加载应用程序代码,默认为False。通过预加载应用程序,你可以节省RAM资源,并且加快服务器启动时间。 可以打印出具体的错误信息 输出error log的颗粒度,有效的LEVEL有:debuginfowarningerrorcritical--access-logfile FILE # 确认要写入Access log的文件FILE. '-' 表示输出到标准输出.--error-logfile FILE, --log-file FILE # 确认要写入Error log的文件FILE. '-' 表示输出到标准错误输出.APP_MODULE: 指定 wsgi application文件, 书写格式 $(MODULE_NAME):$(VARIABLE_NAME)。module_name用来指定将要运行的 wsgi application文件,可是一个完整的点缀名。比如当前目录 myapp 目录下有个 Python 包gunicorn_app, gunicorn_app包下有一个wsgi application文件test.py,则 module_name可以直接写成 gunicorn_app.test; viriable_name表示在 module_name 文件中要调用的对象(是一个WSGI callable, 可以是一个函数,类详情参看WSGI规格说明书)名。
示例:
gunicorn --reload --bind=127.0.0.1:603 --workers=8 --timeout 180 logquery:application 2>&1 gunicorn --bind=127.0.0.1:602 --workers=8 --worker-class=gthread --threads=2 logreceiver:application 2>&1
2.2 gunicorn_django
guniorn_django命令是用来将 Django app部署到 Gunicorn Server上的,原理和 gunicorn一样,只是gunicorn_django做了特殊处理,使得更加适合Django。用法: gunicorn_django [OPTIONS] [SETTINGS_PATH] # 此法适用 Django 1.4 以前参数:OPTIONS:可选参数SETTINGS_PATH: django app中 settings.py文件所在的目录,不写的话默认在当前目录下查找Django 1.4之后的版本推荐使用 gunicorn 命令(强烈推荐)django_admin.py startproject mysite cd mysite gunicorn mysite.wsgi:application
三、Gunicorn配置
3.1、Gunicorn从三个不同的地方读取配置信息。
从framework定义的配置信息中读取,目前 只对 Paster 框架有效。 在命令行中定义,命令行中定义的配置信息将会覆盖掉框架中定义的相同的参数名的值。 将所有的参数信息放到一个文件中,只要是在命令行中可以定义的参数都可以在配置文件中定义( 必须是一个Python源文件,所以你就像在写Python代码一样)。
3.2、使用命令行配置
# 启动 4个workers,绑定到 127.0.0.1:8000
gunicorn --workers=4 --bind=127.0.0.1:8000 myapp.test:app
3.3、使用配置文件 必须是python文件
配置文件
config.py:
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '127.0.0.1:8000' # 绑定ip和端口号
backlog = 512 # 最大挂起的连接数
chdir = '/home/test/server/bin' #g unicorn要切换到的目的工作目录
timeout = 30 # 超时
worker_class = 'gevent' # 工作进程类:使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1 # 工作进程数
threads = 2 # 指定每个进程开启的线程数
loglevel = 'info' # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 设置gunicorn访问日志格式,错误日志无法设置
"""
其每个选项的含义如下:
h remote address
l '-'
u currently '-', may be user name in future releases
t date of the request
r status line (e.g. ``GET / HTTP/1.1``)
s status
b response length or '-'
f referer
a user agent
T request time in seconds
D request time in microseconds
L request time in decimal seconds
p process ID
"""
accesslog = "/var/log/gunicorn_access.log" # 访问日志文件
errorlog = "/var/log/gunicorn_error.log" # 错误日志文件
使用配置文件启动Gunicorn:gunicorn --config=config.py myapp.test:app
注:
两者还可以结合起来用
gunicorn --config=gunicorn_conf.py --worker-class=eventlet myapp.test:app # worker-class默认是sync(同步),这里配置成了 eventlet(并发的)
四、Gunicorn的架构
服务模型(Server Model)Gunicorn是基于 pre-fork 模型的。也就意味着有一个中心管理进程( master process )用来管理 worker 进程集合。Master从不知道任何关于客户端的信息。所有的请求和响应处理都是由 worker 进程来处理的。Master(管理者)主程序是一个简单的循环,监听各种信号以及相应的响应进程。master管理着正在运行的worker集合,通过监听各种信号比如TTIN、 TTOU、and CHLD. TTIN and TTOU响应的增加和减少worker的数目。CHLD信号表明一个子进程已经结束了,在这种情况下master会自动的重启失败的worker。
五、示例
5.1、api.py文件
# coding:utf-8
import web
# url映射
urls = (
'/(.*)', 'hello')
#url处理的类
class hello:
def GET(self, name):
print(web.ctx.env.items())#获取所有的headers
if not name:
name = 'World'
return 'Hello, ' + name + '!'
# 创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类。
app = web.application(urls, globals())
application = app.wsgifunc() # 这两行可以放到外面
if __name__ == "__main__":
app.run() # 启动web应用
5.2 gunicorn管理:启动4个worker
[root@mytest]# gunicorn --workers=4 --bind=0.0.0.0:8080 api:application
[2020-02-27 17:18:38 +0000] [9524] [INFO] Starting gunicorn 19.10.0
[2020-02-27 17:18:38 +0000] [9524] [INFO] Listening at: http://127.0.0.1:8080 (9524)
[2020-02-27 17:18:38 +0000] [9524] [INFO] Using worker: sync
[2020-02-27 17:18:38 +0000] [9529] [INFO] Booting worker with pid: 9529
[2020-02-27 17:18:38 +0000] [9530] [INFO] Booting worker with pid: 9530
[2020-02-27 17:18:38 +0000] [9531] [INFO] Booting worker with pid: 9531
[2020-02-27 17:18:38 +0000] [9532] [INFO] Booting worker with pid: 9532
5.3 查看:启动成功且有4个进程
[root@mytest]# ps -ef| grep gunicorn
root 9524 8296 1 17:18 pts/1 00:00:00 /usr/bin/python2 /usr/bin/gunicorn --workers=4 --bind=127.0.0.1:8080 api:application
root 9529 9524 0 17:18 pts/1 00:00:00 /usr/bin/python2 /usr/bin/gunicorn --workers=4 --bind=127.0.0.1:8080 api:application
root 9530 9524 0 17:18 pts/1 00:00:00 /usr/bin/python2 /usr/bin/gunicorn --workers=4 --bind=127.0.0.1:8080 api:application
root 9531 9524 0 17:18 pts/1 00:00:00 /usr/bin/python2 /usr/bin/gunicorn --workers=4 --bind=127.0.0.1:8080 api:application
root 9532 9524 0 17:18 pts/1 00:00:00 /usr/bin/python2 /usr/bin/gunicorn --workers=4 --bind=127.0.0.1:8080 api:application
root 9534 8274 0 17:18 pts/0 00:00:00 grep --color=auto gunicorn
注: 如果通过gunicorn(wsgi)运行web,那么就是gunicorn配置文件里面的bind = ' 0.0.0.0 :8080。如果写127.0.0.1,那么就只能在本机通过127.0.0.1:port来访问,如果写0.0.0.0,那就就可以用127.0.0.1:port、内网:port、外网:port来访问web接口。--- https://www.cnblogs.com/qiaoer1993/p/12102055.html
六、参考
https://www.cnblogs.com/ExMan/p/10403814.html Gunicorn快速入门
https://www.jb51.net/article/166871.htm Gunicorn运行与配置方法