如何将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 内存的服务器上测得。
