Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

Gunicorn简介

指原莉乃

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

参考

Better performance by optimizing Gunicorn config

通过优化 Gunicorn 配置提高性能

gunicorn官方文档