waitress
是一个纯 Python 实现的 WSGI 服务器,主要用于生产环境部署 Python Web 应用。但它不支持 WebSocket 协议,因为它只实现了 WSGI 规范,而 WebSocket 协议需要 ASGI(Asynchronous Server Gateway Interface)支持。
为什么 waitress
不支持 WebSocket?
- 协议不同 :WSGI 是为同步的、短连接的 HTTP 请求 - 响应周期设计的,而 WebSocket 是一种基于 TCP 的全双工通信协议,允许在客户端和服务器之间进行长期的、实时的双向通信,这超出了 WSGI 的设计范围。
- 阻塞性质 :
waitress
是一个多线程服务器,适合处理传统的 HTTP 请求,但对于 WebSocket 这种需要长时间连接和非阻塞 I/O 的场景,其性能和架构并不适用。
要支持 WebSocket 的 Django 项目,应使用支持 ASGI 的服务器,如 Daphne 或 Uvicorn。
支持 WebSocket 的服务器选择
-
Daphne
- Daphne 是一个 ASGI HTTP 和 WebSocket 服务器,专为 Django Channels 设计。它支持将 Django Channels 项目暴露为 HTTP 和 WebSocket 服务。
- 使用方法:
- 首先安装 Daphne:
pip install daphne
* 然后运行服务器:
daphne -p 8000 myproject.asgi:application
-
Uvicorn
- Uvicorn 是一个快速的 ASGI 服务器,适合现代 Python Web 框架,包括 Django Channels。它支持 HTTP/1.1 和 WebSocket。
- 使用方法:
- 安装 Uvicorn:
pip install uvicorn
* 运行服务器:
uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000
在生产环境中,可以将 Daphne 或 Uvicorn 与反向代理服务器(如 Nginx)结合使用,以提高性能和安全性。