首页 > 解决方案 > 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,因为我遇到了一些问题。

标签: djangoperformancenginxgunicorntime-to-first-byte

解决方案


检查了这一点: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 毫秒(服务器更新),我很满意。


推荐阅读