11

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

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

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

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

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

编辑

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

3 回答 3

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.

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

这在我的负载均衡器后面完美运行。

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

于 2011-09-05T14:44:57.200 回答
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 %}

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

PS。

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

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

于 2011-08-30T18:58:51.800 回答
0

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

http://myapp.com指向您的负载均衡器并http://s3.myapp.com指向您的存储(例如 Amazon S3)也是如此。您不必担心在不同实例上存储多个不同版本。

在这里,您可以找到有关如何使用 Django 设置 Amazon S3、Gzip 压缩和 django-compressor 的完整指南

于 2015-05-06T17:56:27.987 回答