如何将Django项目性能提升4倍,改用Granian ASGI服务器?

摘要:前言 最近我又继续在开发 DjangoStarter 的新版本了。 之前为了实现 docker 部署,我把 Nginx 打包进了 DjangoStarter 的 compose 配置里了,不过这带来了配置的复杂度,特别是还要搭配框架实现 U
前言 最近我又继续在开发 DjangoStarter 的新版本了。 之前为了实现 docker 部署,我把 Nginx 打包进了 DjangoStarter 的 compose 配置里了,不过这带来了配置的复杂度,特别是还要搭配框架实现 URL prefix 之类的功能。 从 v3.2.x 版本开始,我就启动了减法计划,简化代码和功能,减少心智负担,这个 Nginx 容器也是我一直想去掉的。 最近发现 Granian 这个 Rust 开发的 ASGI 服务器,性能高,而且还可以支持静态文件,正好完美符合我的需求,于是这次正好拿来替换原本使用的 Daphne Granian 项目主页: https://github.com/emmett-framework/granian Granian 是一款高性能 Python Web Server,支持 ASGI、WSGI、RSGI,基于 Rust 编写,启动速度快、并发能力强,非常适合 Django / FastAPI / Starlette。 官方描述为 “A Rust HTTP server for Python applications built on top of Hyper/Tokio”。 特点: 支持 ASGI 3、RSGI(Rust-Server-Gateway Interface)和 WSGI 接口。 支持 HTTP/1 和 HTTP/2(未来计划 HTTP/3)协议。 支持静态文件直出 (“Direct static files serving”)。 使用方式 很简单,不需要修改代码,只需要修改启动命令。 目前搭配 DjangoStarter 使用的启动命令是这样的: granian --interface asgi --host 0.0.0.0 --port 8000 --static-path-route /static --static-path-mount ./static-dist config.asgi:application 类似 uvicorn,这个 granian 也支持热重载,加个 --reload 参数就行了 性能测试 本次用 wrk 进行性能测试 测试数据 以下数据在腾讯云 2 cores CPU + 2G 内存的服务器上测得。
阅读全文