2011-08-30 83 views
11

我在負載平衡器後面有兩臺服務器。每臺服務器都運行一個memcached服務器,並且設置文件(兩臺服務器上的設置文件相同)都定義了它們(簡而言之:共享緩存)。如何在負載均衡器後面使用django-compressor?

我要生成的文件的路徑是相同的服務器上,以便客戶端不必下載不止一次。

對於我來說,我需要了解django壓縮機的工作原理。

  • django壓縮機中緩存的實際用途是什麼?
  • 文件內容是否存儲在緩存和文件系統中?
    • 如果是這樣,這恰好第一?
  • 我希望我提出正確的問題在這裏。隨意添加一些。

this更詳細和更好構建的序列將是非常有用的。

編輯

  • 由於服務器都共享一個memcached服務器,應該怎麼設置COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey'(見develop branch)或不使用相同的緩存鍵有助於我有相同的文件名的點?
  • 我明白這一點,mtime是從源js/css文件收集,以確定它們是否可能已經改變,並且應該從它們中生成新文件。正確?
    • 這可能不會發生在每一個負載。它何時發生?
+1

如果我是你並且想知道關於django-compressor的這些細節,我會閱讀代碼(django-compressor code)。 –

+1

我已經做到了。但是,儘管我能理解大部分代碼參與其中,但如果你明白我的意思,我就不會理解它的大局。所以我想:也許有人比我更瞭解django-compressor,並且可以向我解釋它是如何工作的,以便我能更好地理解在查看代碼時應該如何做。 – demux

回答

4

如果你想有相同的緩存文件,你必須確保你有兩臺服務器上相同的輸入。

您應該檢查:

  • 如果{% compress %}...{% endcompress %}代碼是兩臺服務器上相同的(如果部署到一次應該是兩個服務器)
  • 如果所有的CSS/.js文件在兩臺服務器上相同的(如果部署到一次應該是兩個服務器)
  • 如果您的mtime的的CSS(修改時間)/ .js文件是兩臺服務器上相同(部署腳本可能會影響到那些和當前設置日期)

如果滿足所有這些要求,生成的文件應該是相同的(內容和名稱)。

您可以使用「stat」unix命令檢查mtime。

問題的答案:

  • 在Django壓縮機高速緩存的目的是減少從文件系統讀取。
  • 組合代碼生成的文件只存儲在文件系統上。

編輯:

我已經檢查它在我的背後負載平衡器的網站之一。我有不同的.css文件的文件名,但它們對於.js而言是相同的。

對於.css文件我使用預處理器(http://lesscss.org/),所以它影響mtime。

編輯(後話題開發):

什麼是緩存?

由於documentation Django的壓縮存儲在緩存中兩個不同的東西:

  • 的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),並在這裏發佈信息,如果它們匹配。

下週我可能會在我的網站上解決同樣的問題,然後我會發布更多詳細信息。

+0

謝謝你的回答。是的,減少從文件系統讀取數據,這可能是好的,但不會真的加快速度,除非它阻止了一些代碼運行和使用資源。但那不是我所要求的。我想知道存儲在緩存中的內容以及它的用途。我的猜測是,它與確定是否應該生成新文件的過程有關。 – demux

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

+2

會upvote 100x,如果我可以... – mwjackson

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

+0

大聲笑,無恥自我推銷。但是,是的,通常這是很好的建議,儘管這不完全是對原始問題的回答。在我的具體情況中,早在2011年,我所在的公司就與一家本地託管公司開展業務,該公司未提供此類內容託管服務。在這裏,有一個餅乾! +1:D – demux