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

dem*_*mux 11 python django django-compressor

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

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

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

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

更详细和更好的构造序列将是非常有帮助的.

编辑

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

dem*_*mux 12

在开发分支中有一个更改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.
Run Code Online (Sandbox Code Playgroud)

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

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

写这篇文章时,以下是开发分支中的最新提交:https://github.com/jezdez/django_compressor/commit/d48bc5f45d5a55b0f826eb605ccf09a6bf33fcb9


Tom*_*cki 4

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

您应该检查:

  • 如果两台服务器上的代码{% 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 %}

因此,如果您想获得一致的响应,所有服务器上的这些都必须相同。

附言。

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

我可能会在下周在我的网站上解决同样的问题,然后我将发布更多详细信息。