问题 如何在负载均衡器后面使用django-compressor?


我在负载均衡器后面有两台服务器。每个服务器都运行一个memcached服务器,并且设置文件(两个服务器上都相同)都定义了它们(简而言之:共享缓存)。

我希望生成的文件的路径在服务器上是相同的,这样客户端就不必多次下载。

为了让我能够正常工作,我需要了解django压缩机的工作原理。

  • django压缩器中缓存的实际目的是什么?
  • 文件内容是存储在缓存还是文件系统中?
    • 如果是这样,首先会发生什么?
  • 我希望我在这里提出正确的问题。随意添加一些。

比一个更详细和更好的构造序列 这个 会非常有帮助的。

编辑

  • 由于服务器都共享一个memcached服务器,我应该设置 COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey' (看到 发展分支)或使用相同的缓存键是否有助于我拥有相同的文件名?
  • 我理解这一点的方式是,从源js / css文件中收集mtime以确定它们是否已经更改并且应该从它们生成新文件。正确?
    • 这可能不会发生在每个负载上。它什么时候发生?

6112
2017-08-30 16:52


起源

如果我是你,想知道有关django-compressor的详细信息,我会阅读代码(django-compressor代码)。 - Tomasz Wysocki
我已经做到了。但是虽然我可以理解大多数代码部分代码的作用,但如果你知道我的意思,我就无法理解它的大局。所以我想:也许有人一直在研究django-compressor比我更多,并且可以向我解释它是如何工作的,这样我就可以更好地理解在查看代码时要做什么。 - demux


答案:


如果您想拥有相同的缓存文件,则必须确保两台服务器上的输入相同。

你应该检查:

  • 如果代码在 {% compress %}...{% endcompress %} 在两台服务器上是相同的(如果您应该同时部署到两台服务器)
  • 如果两个服务器上的所有.css / .js文件都相同(如果你应该同时部署到两个服务器)
  • 如果.css / .js文件的mtime(修改时间)在两台服务器上都相同(您的部署脚本可能会影响这些并设置当前日期)

如果满足所有这些要求,则生成的文件应该相同(内容和名称)。

您可以使用“stat”unix命令检查mtime。

您的问题的答案:

  • django-compressor中缓存的目的是减少文件系统的读取。
  • 带有组合代码的生成文件仅存储在文件系统中。

编辑:

我在负载均衡器后面的一个网站上查了一下。我有.css文件的不同文件名,但它们对于.js是相同的。

对于.css文件,我使用预处理器(http://lesscss.org/),因此它会影响mtime。

编辑(主题开发后):

缓存中有什么?

由于 文件 django-compressor在缓存中存储了两个不同的东西:

  • 缓存文件的mtime(每个COMPRESS_MTIME_DELAY秒重新检查)
  • 完整生成的代码即:

    <link rel =“stylesheet”href =“http://cdn.inprl.pl/CACHE/css/117f97d818b8.css”type =“text / css”>

由于以下缓存使用,django-compressor将文件系统的读取次数减少到0.这对于页面速度至关重要,因为从内存读取比从文件系统读取快数百倍。文件系统也常常是瓶颈。

它是如何存储在缓存中的?

django-compress使用生成的密钥将代码存储在缓存中。密钥由以下内容生成:

  • 代码 {% compress %}...{% endcompress %}
  • 提到的文件的mtime {% compress %}...{% endcompress %}

因此,如果您希望获得一致的响应,那么所有服务器上的那些必须相同。

PS。

请检查服务器上的约束(如mtime),如果匹配,请在此处发布信息。

我将在下周修复我的网站上的同样问题,然后我将发布其他详细信息。


4
2017-08-30 18:58



谢谢您的回答。是的,减少来自文件系统的读取,这可能是好的,但并没有真正加快这一点,除非它阻止某些代码运行和使用资源。但这不是我要求的。我想知道缓存中存储的内容及其用途。我的猜测是它与确定是否应该生成新文件的过程有关。 - demux


在开发分支中有一个更改css散列方法的新选项。 https://github.com/jezdez/django_compressor

看到 filters / css_default.py中的第61行

我正在使用的设置:

COMPRESS_ENABLED = True
COMPRESS_OFFLINE = False
COMPRESS_STORAGE = 'compressor.storage.GzipCompressorFileStorage'
COMPRESS_CSS_HASHING_METHOD = 'hash' # not using mtime since it differs between servers.

js文件没有这样的选项,因为它们的哈希键从不使用mtime生成。

这完全适用于我的负载均衡器。

写这个时,以下是develop分支中的最新提交: https://github.com/jezdez/django_compressor/commit/d48bc5f45d5a55b0f826eb605ccf09a6bf33fcb9


12
2017-09-05 14:44



如果可以的话,我会投票100倍 - mwjackson


您应该做的是将所有压缩文件放在负载均衡器后面的计算实例之外的存储上。例如,使用Amazon S3将所有文件存储在除应用程序其余部分之外的其他子域上。

所以 http://myapp.com 指向你的负载均衡器和 http://s3.myapp.com 指向您的存储,例如Amazon S3。您不必担心在不同的实例上存储多个不同的版本。

在这里你可以找到一个 有关如何设置Amazon S3,Gzip压缩和django-compressor的完整指南 与Django。


0
2018-05-06 17:56



哈哈,无耻的自我推销。但是,通常这是一个很好的建议,虽然它不是原始问题的答案。在我的具体案例中,早在2011年,我所工作的公司与当地托管公司进行了业务往来,该公司没有提供此类内容托管。在这里,有一个cookie! +1:D - demux