• 一个高性能跨平台基于Python的Waitress WSGI Server的介绍!


    对于Python来说,它有很多web框架,常见的有jango、Flask、Tornado 、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGI Server一般为Gunicorn, 它是一个比较出名的 Web 服务器。在常规的 Django 和 Flask 应用部署中,都有大量的站点使用 Gunicorn。但它只支持Linux,不支持Windows,但有没有类似Gunicorn的产品,但同时支持跨平台?答案是肯定的,那就是Waitress。一个Web框架如何被客户端访问,如下图:

                  Web框架被客户端访问过程

    Web服务网关接口(Web Server Gateway Interface,简称“WSGI”)是一种在Web服务器 和Python Web应用程序或框架之间的标准接口。通过标准化Web服务器和Python web应用程序 或框架之间的行为和通信,WSGI使得编写可移植的的Python web代码变为可能,使其能够部署在任何符合WSGI的web服务器上。独立WSGI服务器相比传统web服务器,使用更少的资源,并提供最高的性能

    Waitress是一个具备生产级品质并有高性能的纯python编写独立的WSGI服务器,它只依赖python标准库,不依赖任何第三方库。同时它可以在多平台下运行,比如windows、linux、unix等,支持http/1.0和http/1.1。最新版本是2.0.0,Python >=3.6.0,官网文档地址:https://docs.pylonsproject.org/projects/waitress/en/latest/,源代码托管网址:https://github.com/Pylons/waitress。

    安装Waitress只需一个命令行:pip install waitress

    运行Waitress有两种方式,一种是代码方式,优点灵活性会更好,可以扩展一些增强功能,比如与其他库的交互,日志记录等,另一种方式waitress-serve命令行方式。本文重点介绍一下waitress-serve命令行方式,该命令行有很多参数,官方文档:https://docs.pylonsproject.org/projects/waitress/en/stable/runner.html,具体如下:

    waitress-serve [OPTS] MODULE:OBJECT
    常用选项:

    --help
    显示此信息。
    --call
    调用给定的对象以获取WSGI应用程序。
    --host=ADDR
    要侦听的主机名或IP地址,默认值为“ 0.0.0.0”,表示“此主机上的所有IP地址”。
    --port=PORT
    要侦听的TCP端口,默认为“ 8080”
    --listen=host:port
    告诉waitress 监听的IP端口。

    例子:

    --listen = 127.0.0.1:8080 --listen = [:: 1]:8080 --listen = *:8080
    可以多次使用此选项以侦听multipe套接字。还支持主机名的通配符,该通配符将绑定到IPv4 / IPv6,具体取决于它们是启用还是禁用。

    --[no-]ipv4
    启用/禁用IPv4支持。

    在侦听通配符地址/端口组合时,这会影响通配符匹配。

    --[no-]ipv6
    启用/禁用IPv6支持。

    在侦听通配符地址/端口组合时,这会影响通配符匹配。

    --unix-socket=PATH
    Unix套接字的路径。如果指定了套接字路径,则会创建一个Unix域套接字,而不是通常的inet域套接字。

    在Windows上不可用。

    --unix-socket-perms=PERMS
    用于Unix域套接字的八进制权限,默认值为'600'。
    --url-scheme=STR
    默认wsgi.url_scheme值,默认为“ http”。
    --url-prefix=STR
    该SCRIPT_NAMEWSGI环境价值。将其设置为除空字符串之外的任何SCRIPT_NAME值,将使WSGI值成为传递的值减去您添加的任何斜杠,并且将导致 PATH_INFO带有该值前缀的所有请求的前缀均被删除。默认为空字符串。
    --ident=STR
    响应中“服务器”标头中使用的服务器身份。默认值为“waitress”。
    调整选项:

    --threads=INT
    用于处理应用程序逻辑的线程数,默认为4。
    --backlog=INT
    服务器的连接积压。默认值为1024。
    --recv-bytes=INT
    调用时要请求的字节数socket.recv()。默认值为8192。
    --send-bytes=INT
    要发送到socket.send()的字节数。默认值为1。9000的倍数应避免部分填充TCP数据包。

    从1.3版开始不推荐使用。

    --outbuf-overflow=INT
    如果挂起的输出大于此大小,则应创建一个临时文件。默认值为1048576(1MB)。
    --outbuf-high-watermark=INT
    当挂起的输出大于此值时,app_iter将暂停,并在将足够的数据写入套接字以使其降至此阈值以下时将恢复。默认值为16777216(16MB)。
    --inbuf-overflow=INT
    如果挂起的输入大于此值,则应创建一个临时文件。默认值为524288(512KB)。
    --connection-limit=INT
    如果已经激活了太多频道,请停止创建新频道。默认值为100。
    --cleanup-interval=INT
    清理无效通道之间的最短间隔时间。默认值为30。请参见 --channel-timeout。
    --channel-timeout=INT
    保持不活动连接打开的最大秒数。默认值为120。“不活动”定义为“未从客户端收到任何数据,也未向客户端发送任何数据”。
    --[no-]log-socket-errors
    切换是否应记录客户端过早断开连接的回溯。默认情况下为开。
    --max-request-header-size=INT
    合并所有请求标头的最大大小。默认值为262144(256KB)。
    --max-request-body-size=INT
    请求正文的最大大小。默认值为1073741824(1GB)。
    --[no-]expose-tracebacks
    切换是否向客户端公开未处理异常的回溯。默认情况下关闭。
    --asyncore-loop-timeout=INT
    以秒为单位的超时值传递到asyncore.loop()。默认值为1。
    --asyncore-use-poll
    use_poll参数传递给asyncore.loop()。帮助克服打开文件描述符的限制。默认值为False。

    更多技术沟通交流,可关注我的微信号:odoodev

     长按图片扫描二维码

     

    也可以关注我的今日头条号:

     

      长按图片扫描二维码

  • 相关阅读:
    [Angular 2] Property Binding
    [Angular 2] Interpolation: check object exists
    [Angular 2] @ViewChild to access Child component's method
    [SVG] Simple introduce for SVG
    资源-软件:资源2
    SQLServer-SQLServer2017:SQLServer2017
    软件-MQ-RabbitMQ:RabbitMQ
    MQ:MQ(IBM MQ)
    app-safeguard-record:record
    引擎-JavaScript:V8(Javascript引擎)
  • 原文地址:https://www.cnblogs.com/nbpowerboy/p/15784296.html
Copyright © 2020-2023  润新知