Waitress:纯 Python 的 WSGI 生产级服务器

Pylons 团队开源了一款 WSGI 服务器叫 Waitress,目前在 GitHub 上获得了 1,585 个 Star。

正文顶部截图

README区域截图

Waitress 是一个纯 Python 实现的 WSGI 服务器,可用于生产环境。它不依赖任何第三方库,只使用 Python 标准库中的模块。安装非常轻量,pip install 之后就能用,不需要编译 C 扩展,也不会出现版本冲突。

WSGI 是 Python Web 应用和服务器之间的标准接口。Waitress 实现了接口的服务器端。它接收 HTTP 请求,按 WSGI 规范把请求数据传给应用,再把应用的响应返回给客户端。这个过程和框架无关,Flask、Django、Pyramid 都可以使用。Pylons 团队本身也是 Pyramid 框架的维护者,在 WSGI 层面的衔接上做得比较到位。

Waitress 支持 CPython 和 PyPy 两种 Python 解析器,能在 Unix 和 Windows 上运行,兼容 Python 3.9 及更高版本。支持 HTTP/1.0 和 HTTP/1.1 协议。项目采用纯 Python 编写,没有 C 扩展,在新版本 Python 发布后,兼容性跟进速度通常比较快。

安装 Waitress 用 pip:

pip install waitress

安装后使用 waitress-serve 命令启动应用:

waitress-serve --port=8080 myapp:application

myapp:application 的格式是模块名冒号应用对象名,这是 WSGI 应用的标准引用方式。也可以指定多个应用,或者用 --call 参数支持工厂函数模式。

在代码中调用:

from waitress import serve
serve(app, host='0.0.0.0', port=8080)

serve 函数接受 WSGI 应用对象,host 和 port 指定监听地址和端口。调用后进程会阻塞在 serve 函数中,持续处理请求直到收到终止信号。收到 SIGTERM 或 Ctrl+C 后,Waitress 会优雅关闭,处理完当前请求再停止。

Waitress 使用多线程模型处理请求,默认启动 4 个 worker 线程。用 --threads 参数或 serve 函数的 threads 参数可以调整。每个线程独立处理请求。多线程模型适合 I/O 密集型的 Web 应用。如果应用中有大量 CPU 计算,多线程的优势会减弱。

Waitress 的架构比较简洁。它基于 asyncore 实现事件循环,这是 Python 标准库中较早的异步 IO 模块。每个客户端连接对应一个 channel,channel 负责解析 HTTP 请求并生成响应。Worker 线程从 channel 中取出请求,调用 WSGI 应用处理,然后将结果写回 channel。这套机制不依赖第三方事件库,降低了部署时的依赖复杂度。

常用配置参数:

  • threads:worker 线程数,默认 4
  • host:监听地址,默认 0.0.0.0
  • port:监听端口,默认 8080
  • url_scheme:http 或 https
  • backlog:连接队列大小
  • max_request_header_size:请求头的最大字节数,默认 262144
  • max_request_body_size:请求体的最大字节数,默认 1073741824
  • cleanup_interval:清理过期连接的时间间隔,默认 30 秒
  • channel_timeout:空闲连接的超时时间,默认 120 秒
  • send_bytes:一次 socket 发送的最大字节数

这些参数覆盖了部署时常见的安全和性能需求。max_request_body_size 可以防止大请求体攻击,channel_timeout 能及时回收空闲连接,cleanup_interval 控制清理线程的执行频率。

Waitress 经过多年维护,在多个 Python 项目中用于生产部署。稳定性经过了大量验证。项目在 GitHub 上持续维护,issue 和 PR 的响应比较及时。

在 Windows 上,一些 WSGI 服务器无法正常使用。Gunicorn 只支持 Unix 系统,在 Windows 上无法运行。Waitress 原生支持 Windows,是在 Windows 上部署 Python Web 应用的直接选项。如果团队使用 Windows 开发环境,测试和调试时可以直接用 Waitress,环境差异较小。

对于中小型项目,Waitress 可以直接对外提供 Web 服务,不需要额外的代理服务器。如果需要支撑更高并发,可以在 Waitress 前面加一层 Nginx 做反向代理。Waitress 的配置方式简单,运维成本较低,适合团队规模不大的场景。对于大型项目,可以在多台机器上分别启动 Waitress,用负载均衡器分发流量。

Waitress 也提供了对 HTTPS 的支持,但官方推荐的做法是在 Waitress 前面用反向代理处理 TLS 终止。这样可以让 Waitress 专注于请求处理,TLS 证书管理和加密卸载交给专门的代理工具完成。

Waitress 的日志输出走 Python 标准 logging 模块,可以和其他模块的日志统一管理。默认情况下日志输出到 stderr,可以通过 --log-file 参数指定日志文件。

总体来看,Waitress 是一个务实的选择。它在功能上不追求大而全,而是把 WSGI 服务器这一件事做好。零外部依赖、跨平台支持、简单的配置方式,让它在 Python Web 部署领域占有一席之地。对于正在使用 Python Web 框架的开发团队,Waitress 值得纳入技术选型的候选列表。

on Web 部署领域占有一席之地。对于正在使用 Python Web 框架的开发团队,Waitress 值得纳入技术选型的候选列表。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐