Gunicorn简介
Gunicorn是Python Web服务器网关接口HTTP服务器。它是从Ruby的Unicorn项目移植的前叉工作模型。 Gunicorn服务器与许多Web框架具有广泛的兼容性,这些框架只需实施即可,并且可以节省服务器资源,而且速度相当快。
安装
简单的安装就是用pip
$ pip install gunicorn
Gunicorn默认使用的同步worker,在请求处理期间,其他的请求会等待,相应速度很慢。若希望某些应用代码在请求处理期间暂停一会,去处理其他的事情,则需要异步worker。
Gunicorn可以使用 Eventlet 和 Gevent。例如:
$ pip install greenlet # Required for both
$ pip install eventlet # For eventlet workers
$ pip install gunicorn[eventlet] # Or, using extra
$ pip install gevent # For gevent workers
$ pip install gunicorn[gevent] # Or, using extra
常用参数
-c CONFIG, --config=CONFIG - 通过以下方式指定一个配置文件,$(PATH) 或 file:$(PATH) 或 python:$(MODULE_NAME) 。
-b BIND, --bind=BIND - 指定要绑定的服务器嵌套字。服务器嵌套字可以用以下格式:$(HOST) , $(HOST):$(POST) 或者 unix:$(PATH) 。一个IP是一个有效的$(HOST)。
-w WORKERS, --workers=WORKERS - 设置worker进程的数量。每个CPU核心能分2~4个worker。
-k WORKERCLASS, --worker-class=WORKERCLASS - worker进程的类型。你能将它设置为 $(NAME) ,这个$(NAME)可以是 sync , eventlet , gevent , tornado , gthread , gaiohttp(deprecated) 。sync 是默认的,worker同步阻塞运行,效率低。
-n APP_NAME, --name=APP_NAME - 如果安装了 setproctitle python模块,则可以调整Gunicorn进程的名字。
运行Gunicorn
可以使用命令来运行Gunicorn,也可以与Django或Paster集成
基本用法
$ gunicorn [options] module_name:variable_name
module_name对应python文件,variable_name对应web应用实例。
以最简单的flask应用为例:
$ cat main.py
from flask import Flask
app = Flask(name)
@app.route('/')
def index():
return 'hello world'
if name == 'main':
app.run()
启动代码:
$ gunicorn --worker=3 main:app -b 0.0.0.0:8080
配置概述
Gunicorn从三个地方拉取配置信息,优先级从低到高为:
- web框架的配置(目前只支持Paster应用框架)
- 配置文件
- 命令行
命令行
优先级最高,如果在命令行中指定了一个选项,它将覆盖在应用程序中或配置文件中所指定的所有其他设置。并非所有Gunicorn设置都可以从命令行设置。要查看命令行设置的完整列表,你可以执行以下操作:
gunicorn -h
配置文件
配置文件应该是有效的Python源文件。它只需要在文件系统中可读即可。更具体地说,它不需要是可导入的。任何Python都是有效的。只要考虑每次启动Gunicorn时都会运行(包括当你指示Gunicorn重新加载时)。要设置参数,没有特殊的语法,只需用Python语法赋值即可。
例如,在django项目中创建 gunicorn_conf.py :
import multiprocessing
# unix domain socket方式
# unix:千万不要写掉了。确保路径文件夹存在,sock文件会自动创建和销毁,不要手动创建。
bind = 'unix:/home/cloudsen/work/deploy/webservers/sockets/nginx-gunicorn.sock'
# tcp方式
#bind = '127.0.0.1:8000'
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent'
errorlog = '/home/cloudsen/work/deploy/webservers/gunicorn/guicorn.error.log'
accesslog = '/home/cloudsen/work/deploy/webservers/gunicorn/gunicorn.access.log'
proc_name = 'gunicorn_myblog'
使用配置文件启动:
cd <项目路径>
gunicorn -c python:RedQueen.gunicorn_conf RedQueen.wsgi:application
日志输出:
[2018-11-19 23:39:14 +0800] [2930] [INFO] Starting gunicorn 19.9.0
[2018-11-19 23:39:14 +0800] [2930] [INFO] Listening at: unix:/home/cloudsen/work/deploy/webservers/sockets/nginx-gunicorn.sock (2930)
[2018-11-19 23:39:14 +0800] [2930] [INFO] Using worker: gevent
[2018-11-19 23:39:14 +0800] [2933] [INFO] Booting worker with pid: 2933
...
举个栗子
以httpbin项目为例:
$ git clone https://github.com/postmanlabs/httpbin.git
$ cd httpbin
$ gunicorn -b 127.0.0.1:5000 httpbin:app -k gevent