【问题标题】:Django + Nginx + Gunicorn - Why is my TTFB so high?Django + Nginx + Gunicorn - 为什么我的 TTFB 这么高?
【发布时间】:2021-09-12 13:50:49
【问题描述】:

这是我第一次使用 nginx/gunicorn 设置 Web 服务器,所以如果我的 TTFB 如此之高有什么明显的原因,我会道歉。

根据 gtmetrix.com,我的 TTFB 为 1.4 秒:

在我自己的测试中,我的 TTFB 约为 1.3 秒。

我对它为什么这么高感到困惑,即使我启用了 Brotli、缓存(静态和媒体文件)、Http2,我启用了 html 压缩器,所以我不知道为什么。我的服务器是纽约市 Digital Ocean 上的 2GB CPU(靠近我所在的地方),所以位置不是问题。我已经检查了this 堆栈溢出问题,但是删除 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 的 this 文章,我的 TTFB 很高是因为

在 CloudFlare,我们广泛使用 nginx,在研究 TTFB 时发现,在使用或不使用压缩时,TTFB 与 nginx 存在显着差异。网页的Gzip压缩大大减少了网页下载的时间,但压缩本身是有代价的。即使完整下载速度更快,该成本也会导致 TTFB 更大。

所以我尝试删除 Brotli,但 TTFB 仍然相当高,并且在 Nginx conf 文件中禁用 gzip 对 TTFB 没有帮助。

描述: Nginx-Gunicorn 服务器在 Django(sqlite 数据库)上使用 Digitalocean NYC 2GB CPU

编辑:我停止使用 Cloudflare,因为我遇到了一些问题。

【问题讨论】:

  • gzip压缩一般在nginx配置中
  • 另外,请检查您的 SSL 握手时间。
  • @Trent,是的,它通常在我的 nginx 配置文件中,但禁用它仍然显示它被 gzip 压缩。
  • 渲染的 HTML 有多大?
  • @Trent 呈现的 HTML 为 81.5KB。当包括网站上的所有其他内容时,它是 1.43MB。另外我不确定检查 SSL 握手时间。

标签: django performance nginx gunicorn time-to-first-byte


【解决方案1】:

检查了这个: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。我使用的是profanity check,我将它从我的模板中删除,这将 ttfb 减少了大约 750 毫秒。 ttfb 的最大修复(至少在我的情况下)是检查第三方包以及您在模板中加载的内容。

编辑 3: 帮助我的 TTFB 的另一件大事是删除包 django-htmlmin。删除它使我的 TTFB 下降了 300 毫秒,所以现在我的 ttfb 为 10~40 毫秒(无服务器更新)或 200~500 毫秒(服务器更新),我很满意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2013-01-11
    • 2021-10-20
    • 2015-04-16
    • 1970-01-01
    • 2019-07-12
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多