django - Django + Nginx + Gunicorn - 为什么我的 TTFB 这么高?
问题描述
这是我第一次使用 nginx/gunicorn 设置 Web 服务器,所以如果我的 TTFB 如此之高有什么明显的原因,我会道歉。
根据 gtmetrix.com,我的 TTFB 为 1.4 秒:
在我自己的测试中,我的 TTFB 约为 1.3 秒。
我对它为什么这么高感到困惑,即使我启用了 Brotli、缓存(静态和媒体文件)、Http2,我启用了 html 缩小器,所以我不知道为什么。我的服务器是纽约市 Digital Ocean 上的 2GB CPU(靠近我所在的地方),所以位置不是问题。我已经检查了这个堆栈溢出问题,但是删除 django-htmlmin 包仍然有很高的 ttfb。我在这个页面上的 Django 视图只是:
@minified_response
def home(request):
context = {
'posts': Post.objects.all()
}
return render(request, 'blog/home.html', context)
我认为这是一个简单的查询,我不认为 TTFB 仅仅为了这个 get 查询就这么高。我的数据库有问题吗(现在我正在使用 sqlite)?如果您需要我的任何其他文件或东西来帮助我调试,请告诉我。
另外,根据 Cloudflare 的这篇文章,我的 TTFB 很高,因为
在 CloudFlare,我们广泛使用 nginx,并且在研究 TTFB 时发现,在使用或不使用压缩时,TTFB 与 nginx 存在显着差异。网页的Gzip压缩大大减少了网页下载的时间,但压缩本身是有代价的。即使完整下载更快,该成本也会导致 TTFB 更大。
所以我尝试删除 Brotli,但 TTFB 仍然相当高,并且在 Nginx conf 文件中禁用 gzip 对 TTFB 没有帮助。
描述:在 Django(sqlite 数据库)上使用 Digitalocean NYC 2GB CPU 的 Nginx-Gunicorn 服务器
编辑:我停止使用 Cloudflare,因为我遇到了一些问题。
解决方案
检查了这一点:https ://www.digitalocean.com/community/questions/how-can-i-improve-the-ttfb
事实证明,使用 fastcgi 缓存可以大大加快速度。我之前的 ttfb 大约是 1300ms,现在(如果服务器没有更新)ttfb 大约是 10~40ms,但是如果页面是从服务器的数据更新的,ttfb 大约是 1300~2000ms,但我没关系。请告诉我使用 fastcgi_cache 是否有任何问题,但到目前为止还没有任何问题。我的 Nginx 文件:
# Other Stuff
fastcgi_cache_path /etc/nginx-cache levels=1:2 keys_zone=djangocache:100m inactive=60m;
fastcgi_cache_key # Your Cache Key (Ex: https://example.com/);
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# ...
server {
# more stuff
location / {
fastcgi_cache_valid 301 30d;
fastcgi_cache djangocache;
fastcgi_cache_valid 200 30m;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_use_stale updating;
fastcgi_cache_background_update on;
fastcgi_pass # Your server name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
add_header X-Fastcgi-Cache $upstream_cache_status;
# ...
}
# ...
}
如果您发现我上面的代码有任何问题,请告诉我,我仍在尝试使用 fastcgi 缓存。
编辑 2:
请注意{% load %}
模板中的模块,因为其中一些会大大降低 ttfb 的速度。我正在使用亵渎性检查,并将其从模板中删除,这将 ttfb 减少了约 750 毫秒。ttfb(至少在我的情况下)的最大修复是检查第三方包以及您在模板中加载的内容。
编辑 3: 帮助我的 TTFB 的另一件大事是删除包django-htmlmin。删除它使我的 TTFB 下降了 300 毫秒,所以现在我的 ttfb 是 10~40 毫秒(没有服务器更新)或 200~500 毫秒(服务器更新),我很满意。
推荐阅读
- java - 从 Spring EventListener 更新 Vaadin 8 UI
- java - 非线程安全字段不应该是静态的,sonar lint 错误
- android - 替换嵌套的 AsyncTasks
- javascript - 具有 1 个数组条件和外部布尔条件的过滤数组
- android - View.GONE 不适用于“Constraint.Group”特定子项
- android - 任务“:app:transformClassesWithShrinkResForDebug”执行失败
- sql - 使用 SSIS 将 CSV 文件值合并到现有 Azure SQL 数据库中
- android - 在 SDK 20 及更低版本中使用选择器的 ImageView 色调
- ios - 在 Objective C 中的 main_queue 上执行动画,为什么?
- html - CSS - 悬停时的弹簧侧边菜单