对于Python来说,它有很多web框架,常见的有jango、Flask、Tornado 、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGI Server一般为Gunicorn, 它是一个比较出名的 Web 服务器。在常规的 Django 和 Flask 应用部署中,都有大量的站点使用 Gunicorn。但它只支持Linux,不支持Windows,但有没有类似Gunicorn的产品,但同时支持跨平台?答案是肯定的,那就是Waitress。一个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
长按图片扫描二维码
也可以关注我的今日头条号:
长按图片扫描二维码