zoukankan      html  css  js  c++  java
  • python gunicorn详解

    Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。
    和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

    gunicorn 安装

    pip install gunicorn

    gunicorn + flask 简单示例

    flask程序需要先安装flask module,pip install flask。

    gunicorn_demo.py

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/demo', methods=['GET'])
    def demo():
        return "gunicorn and flask demo."

    通过gunicorn运行flask app

    # gunicorn gunicorn_demo:app
    [2017-12-23 10:36:09 +0000] [24441] [INFO] Starting gunicorn 19.7.1
    [2017-12-23 10:36:09 +0000] [24441] [INFO] Listening at: http://127.0.0.1:8000 (24441)
    [2017-12-23 10:36:09 +0000] [24441] [INFO] Using worker: sync
    [2017-12-23 10:36:09 +0000] [24446] [INFO] Booting worker with pid: 24446

    测试结果

    # curl http://127.0.0.1:8000/demo
    gunicorn and flask demo.

    gunicorn 详细配置

    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配置。

    server钩子

    • on_starting
    • on_reload
    • when_ready
    • pre_fork
    • post_fork
    • post_worker_init
    • worker_init
    • worker_abort
    • pre_exec
    • pre_request
    • post_request
    • child_exit
    • worker-exit
    • nworkers_changed
    • on_exit

    Gunicorn配置

     Gunicorn从三个不同的地方读取配置信息。

     第一个地方:从framework定义的配置信息中读取,目前只对 Paster 框架有效。

     第二个地方:在命令行中定义,命令行中定义的配置信息将会覆盖掉框架中定义的相同的参数名的值。

     最后:将所有的参数信息,放到一个文件中,只要是在命令行中可以定义的参数中,在配置文件中都可以定义。(是一个Python源文件,所以你就像在写Python代码一样)

     第一个地方不不介绍了,不实用。重点介绍第二种和第三种,其实这两种方式都是相同的。

     显示说有配置选项:

    gunicorn -h

    使用命令行配置:

    在上面的 myapp 例子的基础上

    gunicorn --workers=4 --bind=127.0.0.1:8000 myapp.test:app

    上面的命令 启动 4个 workers ,绑定到 127.0.0.1:8000

      配置文件 config.py 源码

    import multiprocessing 
    
    bind = "127.0.0.1:8001"
    workers = multiprocessing.cpu_count() * 2 + 1

    使用配置文件启动Gunicorn

    gunicorn --config=config.py myapp.test:app

    和上面用命令行配置的效果完全一样,当然两者还可以结合起来用:

    gunicorn --config=gunicorn_conf.py --worker-class=eventlet myapp.test:app

    worker-class默认是sync(同步),我们配置成了 eventlet(并发的)

    本人自己运营一个淘宝店,如果你觉得文章写得好。帮忙给淘宝店点个关注。谢谢

    链接: https://shop211977203.taobao.com/



  • 相关阅读:
    【tarjan】【树的直径】【CF】K. Königsberg Bridges
    【组合数学】【恒等式】简单和、交错和
    【组合数学】【恒等式】$sum_{k=0}^{r}C_m^k imes C_{n}^{r-k}=C_{m+n}^r$
    【组合数学】【恒等式】$C_{n}^{r} imes C_{n-r}^{k-r}=C_{n}^{k} imes C_k^{r}$
    【树形DP】D. Serval and Rooted Tree
    【图论】图的欧拉定理
    【图论】网络流解决二分图最大匹配量问题
    【计算几何】atan2函数
    【单峰计数DP】Problem F – Fabricating Sculptures
    Java基础之:自定义泛型
  • 原文地址:https://www.cnblogs.com/zlel/p/11156070.html
Copyright © 2011-2022 走看看