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

11

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

我希望服务器上生成的文件路径相同,以便客户端不必重复下载。

为了使这个工作正常,我需要理解django compressor的工作原理。

  • django compressor缓存的实际目的是什么?
  • 文件内容同时存储在缓存和文件系统中吗?
    • 如果是,先发生哪一个?
  • 我希望我提出了正确的问题。欢迎添加一些问题。

这个更详细和更好地构建的序列将非常有帮助。

编辑

  • 由于两个服务器共享一个memcached服务器,因此我应该设置COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey'(参见 develop分支),或者使用相同的缓存键是否有助于使文件名相同?
  • 我的理解是,mtime从源js/css文件中收集,以确定它们是否可能已更改,并且应该从它们生成新文件。对吗?
    • 这可能不会在每次加载时都发生。什么时候发生?

1
如果我是你并且想要了解有关django-compressor的详细信息,我会阅读代码(django-compressor的代码)。 - Tomasz Wysocki
1
我已经做过了。但是尽管我可以逐个部分地理解大多数代码在做什么,但如果你知道我的意思,我无法理解它的整体情况。所以我想:也许有人比我更多地在django-compressor上工作,并且可以向我解释它的工作原理,这样我就可以更好地理解在查看代码时要做什么。 - demux
3个回答

12

在develop分支中,有一种新的选项可以更改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


4
如果你想要相同的缓存文件,你必须确保两个服务器上的输入是相同的。
你应该检查:
- 如果在 `{% compress %}...{% endcompress %}` 中的代码在两个服务器上是相同的 (如果你同时部署到两个服务器上,那么它应该是相同的) - 如果所有的 .css/.js 文件在两个服务器上都是相同的 (如果你同时部署到两个服务器上,那么它应该是相同的) - 如果你的 .css/.js 文件的 mtime (修改时间) 在两个服务器上是相同的 (你的部署脚本可能会影响它们并设置当前日期)
如果所有这些要求都得到满足,生成的文件应该是相同的(内容和名称)。
你可以使用 "stat" Unix 命令来检查 mtime。
问题的回答:
- Django-compressor 中缓存的目的是减少对文件系统的读取。 - 生成的合并代码文件仅存储在文件系统中。
编辑:
我在负载均衡器后面的一个网站上进行了检查。我有不同的 .css 文件名,但是它们的 .js 文件是相同的。
对于 .css 文件,我使用预处理器 (http://lesscss.org/),所以它会影响 mtime。

编辑(主题开发后):

缓存中有什么?

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

  • 缓存文件的修改时间(每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 %}中的代码
  • {% compress %}...{% endcompress %}中提到的文件的修改时间
所以,如果想要保持一致的响应,则这些必须在所有服务器上相同。
附注:
请检查服务器上的限制(例如修改时间),并在此处发布信息以确认其是否匹配。
我将在下周修复我的站点上的相同问题,并稍后发布详细信息。

谢谢你的回答。是的,减少对文件系统的读取可能是好的,但除非它阻止了某些代码的运行和资源的使用,否则并不会真正加快速度。但那不是我想问的问题。我想知道缓存中存储了什么以及它的作用是什么。我的猜想是它与确定是否应该生成新文件的过程有关。 - demux

0
你应该将所有压缩文件存储在负载均衡器后面的计算实例之外的存储器中。例如,使用Amazon S3在另一个子域中存储所有文件,而不是与应用程序的其余部分存储在同一子域中。
因此,http://myapp.com指向负载均衡器,http://s3.myapp.com指向存储器,比如Amazon S3。您无需担心在不同实例上存储多个不同版本。
这里你可以找到一个完整设定指南 Amazon S3、Gzip 压缩和Django-compressor

哈哈,无耻的自我推销。但是,总的来说这是一个好建议,虽然它并不完全回答原始问题。在我个人的情况下,早在2011年,我所在的公司与一家当地的托管公司合作,该公司没有提供此类内容托管服务。给你一个饼干!+1 :D - demux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接