我在负载均衡器后面有两台服务器。每个服务器都运行一个memcached服务器,并且设置文件(两个服务器上都相同)都定义了它们(简而言之:共享缓存)。
我希望生成的文件的路径在服务器上是相同的,这样客户端就不必多次下载。
让我开始工作,我需要了解django压缩机是如何工作的。
比this更详细,构造更好的序列非常有用。
修改
COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey'
(参见develop branch)还是使用相同的缓存密钥有助于我拥有相同的文件名?答案 0 :(得分:12)
在开发分支中有一个更改css散列方法的新选项。 https://github.com/jezdez/django_compressor
请参阅line 61 in filters/css_default.py
我正在使用的设置:
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
答案 1 :(得分:4)
如果您想拥有相同的缓存文件,则必须确保两台服务器上的输入相同。
您应该检查:
{% compress %}...{% endcompress %}
中的代码在两台服务器上都相同(如果您应该同时部署到两台服务器)如果满足所有这些要求,生成的文件应该相同(内容和名称)。
您可以使用“stat”unix命令检查mtime。
您的问题的答案:
修改强>
我在负载均衡器后面的一个网站上查了一下。我有.css文件的不同文件名,但它们对于.js。
是相同的对于.css文件,我使用预处理器(http://lesscss.org/),因此它会影响mtime。
编辑(主题开发后):
缓存中有什么内容?
由于documentation django-compress存储在缓存中有两个不同的东西:
完整生成的代码,即:
< link rel =“stylesheet”href =“http://cdn.inprl.pl/CACHE/css/117f97d818b8.css”type =“text / css”>
由于以下缓存使用,django-compressor将文件系统的读取次数减少到0.这对于页面速度至关重要,因为从内存读取比从文件系统读取快数百倍。文件系统也常常是瓶颈。
如何将其存储在缓存中?
django-compress使用生成的密钥将代码存储在缓存中。密钥来自:
{% compress %}...{% endcompress %}
{% compress %}...{% endcompress %}
因此,如果您希望获得一致的响应,那么所有服务器上的那些必须相同。
<强> PS。强>
请检查服务器上的约束(如mtime),并在此处发布匹配的信息。
我可能会在下周修复我网站上的同样问题,然后我会发布其他详细信息。
答案 2 :(得分:0)
您应该做的是将所有压缩文件放在负载均衡器后面的计算实例之外的存储上。例如,使用Amazon S3将所有文件存储在除应用程序其余部分之外的其他子域中。
因此http://myapp.com
指向您的负载均衡器,http://s3.myapp.com
指向您的存储,例如Amazon S3。您不必担心在不同的实例上存储多个不同的版本。
在这里你可以找到一个带有Django的complete guide of how to setup Amazon S3, Gzip Compression and django-compressor。