Как использовать django-компрессор за балансировщиком нагрузки?

У меня есть два сервера за балансировщиком нагрузки. На каждом сервере работает сервер memcached, и файл настроек (который идентичен на обоих серверах) имеет их обоих (короче говоря: общий кэш).

Я хочу, чтобы пути к сгенерированным файлам были идентичны на серверах, чтобы клиенту не приходилось загружать более одного раза.

для меня, чтобы получить эту работу, мне нужно понять, как работает компрессор django.

  • Что такое фактическое назначение кэша в компрессоре django?
  • содержимое файла хранится как в кэше, так и в файловой системе?
    • если да, то что происходит первым?
  • надеюсь, я задаю правильные вопросы здесь. Не стесняйтесь добавлять некоторые.

более подробная и лучше построенная последовательность, чем этой было бы очень полезно.

редактировать

  • так как серверы оба разделяют memcached сервер, я должен установить COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey' (см. развитие филиала) или использование одного и того же ключа кэша способствует моей точке с одинаковыми именами файлов?
  • как я понимаю, mtime собирается из исходных файлов js/css, чтобы определить, могут ли они измениться, и из них должен быть создан новый файл. Правильно?
    • это, вероятно, не происходит при каждой загрузке. Когда это происходит?

3 ответов


Если вы хотите иметь идентичные файлы кэша вы должны быть уверены, что у вас есть идентичные входные на обоих серверах.

вы должны проверить:

  • если в коде {% compress %}...{% endcompress %} идентично на обоих серверах (если вы развертываете на обоих серверах сразу)
  • если все ваши .стиль CSS./файлы js идентичны на обоих серверах (если вы развертываете на обоих серверах сразу)
  • если mtime (изменить время) вашего .стиль CSS./файлы JS является идентичные на обоих серверах (ваш сценарий развертывания может повлиять на них и установить текущую дату)

Если все эти требования ale удовлетворены, сгенерированные файлы должны быть идентичными (содержание и имена).

вы можете проверить mtime с помощью команды unix" stat".

ответы на ваши вопросы:

  • цель кэша в django-compressor-уменьшить чтение из файловой системы.
  • сгенерированный файл с комбинированным кодом сохраняется только в файловой системе.

Edit:

Я проверил его на одном из моих сайтов за балансировщиком нагрузки. У меня разные имена файлов .CSS-файлы, но они идентичны для .js.

For .css файлы я использую препроцессор (http://lesscss.org/), поэтому это влияет на mtime.

Edit (после разработки темы):

что находится в кэше?

из-за документация django-компрессор хранит в кэше две разные вещи:

  • mtime кэшированных файлов (перепроверяется каждые секунды COMPRESS_MTIME_DELAY)
  • полный сгенерированный код ie.:

из-за следующего использования кэша django-compressor уменьшает количество считываний в файловую систему до 0. Это необходимо для скорости страницы, потому что чтение из памяти в сотни раз быстрее, чем чтение из файловой системы. Также файловая система очень часто является узким местом.

как он хранится в кэше?

django-compress хранит код в кэше, используя сгенерированный ключ. Ключ генерируется из:

  • код {% compress %}...{% endcompress %}
  • mtime файлов, упомянутых в {% compress %}...{% endcompress %}

таким образом, они должны быть одинаковыми на всех серверах, если вы хотите иметь согласованный ответы.

PS.

пожалуйста, проверьте ограничения (например, mtime) на вашем сервере и разместите здесь информацию, если они совпадают.

Я буду исправлять ту же проблему на своем сайте, вероятно, на следующей неделе, я опубликую дополнительные сведения.


в ветке разработки есть новая опция для изменения метода хеширования css. https://github.com/jezdez/django_compressor

посмотреть строка 61 в 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 в любом случае.

это отлично работает за моим loadbalancer.

когда это написано, следующее является последним фиксацией в ветке разработки: https://github.com/jezdez/django_compressor/commit/d48bc5f45d5a55b0f826eb605ccf09a6bf33fcb9


что вам нужно сделать, так это поместить все сжатые файлы в хранилище вне ваших вычислительных экземпляров, которые находятся за балансировщиком нагрузки. Например, используйте Amazon S3 для хранения всех файлов в другом поддомене, чем в остальной части приложения.

Так http://myapp.com указывает на ваш балансировщик нагрузки и http://s3.myapp.com указывает на ваше хранилище, например Amazon S3. Вам не придется беспокоиться о хранении нескольких разных версий в разных экземплярах.

здесь вы можете найти полное руководство по настройке Amazon S3, сжатия Gzip и Django-компрессора С Джанго.