Как использовать 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-компрессора С Джанго.