如何在负载平衡器后面使用Djangompressure?

2024-05-16 11:45:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

为了让这个工作,我需要了解django压缩机是如何工作的。在

  • django compressor中缓存的实际用途是什么?在
  • 文件内容是否同时存储在缓存和文件系统中?
    • 如果是的话,哪一个先发生?在
  • 我希望我问的问题是对的。请随意添加一些。在

一个比this更详细、构造更好的序列将非常有用。在

编辑

  • 由于两个服务器共享一个memcached服务器,我应该设置COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey'(请参见develop branch),还是使用相同的缓存键会导致我的文件名相同?在
  • 根据我的理解,mtime是从源js/css文件中收集来的,以确定它们是否已经更改,并且应该从中生成一个新文件。对的?
    • 这可能不会发生在每一个负载上。什么时候发生的?在

Tags: 文件django路径服务器编辑内容客户机定义
3条回答

在develope分支中有一个新的选项来更改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

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

您应该检查:

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

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

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

您问题的答案:

  • django压缩器中缓存的目的是减少文件系统的读取。在
  • 生成的包含组合代码的文件仅存储在文件系统中。在

编辑:

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

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

编辑(主题开发后):

缓存中有什么?

由于documentationdjango compressor在缓存中存储了两个不同的内容:

  • 缓存文件的mtime(每压缩一次检查一次)
  • 完整生成代码,即:

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

由于以下缓存使用情况,django压缩器将对文件系统的读取次数减少到0。这对于页面速度至关重要,因为从内存读取比从文件系统读取快数百倍。而且文件系统常常是瓶颈。在

如何将其存储在缓存中?

django compress使用生成的密钥在缓存中存储代码。密钥生成自:

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

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

附言。

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

我将在我的网站上修复同样的问题可能下个星期,我会张贴更多的细节。在

您应该做的是将所有压缩文件放在负载平衡器后面的计算实例之外的存储器中。例如,使用amazons3将所有文件存储在应用程序的其他子域中。在

因此,http://myapp.com指向的是负载平衡器,http://s3.myapp.com指向的是存储,比如amazons3。您不必担心在不同的实例上存储多个不同的版本。在

在这里您可以找到一个带有Django的complete guide of how to setup Amazon S3, Gzip Compression and django-compressor。在

相关问题 更多 >