Как использовать django-компрессор за балансиром нагрузки?
У меня есть два сервера за балансировкой нагрузки. На каждом сервере запущен сервер memcached, а файл настроек (идентичный на обоих серверах) определил их оба (вкратце: общий кэш).
Я хочу, чтобы пути к сгенерированным файлам были одинаковыми на серверах, чтобы клиент не загружался несколько раз.
Чтобы получить эту работу, мне нужно понять, как работает компрессор django.
- Какова фактическая цель кеша в компрессоре django?
- Сохраняется ли содержимое файла как в кеше, так и в файловой системе?
- Если это так, что происходит первым?
- Надеюсь, я задаю здесь правильные вопросы. Не стесняйтесь добавлять некоторые.
Более подробная и лучше построенная последовательность, чем this, будет очень полезна.
Edit
- Поскольку серверы совместно используют сервер memcached, должен ли я установить
COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey'
(см. развернуть ветку) или использует один и тот же ключ кеша с моей точки зрения иметь те же имена файлов?
- Как я понимаю, mtime собирается из исходных файлов js/css, чтобы определить, могут ли они быть изменены, и из них должен быть создан новый файл. Верный?
- Это, вероятно, не происходит при каждой загрузке. Когда это произойдет?
Ответы
Ответ 1
Если вы хотите иметь одинаковые файлы кеша, вы должны быть уверены, что у вас одинаковый ввод на обоих серверах.
Вы должны проверить:
- если код в
{% compress %}...{% endcompress %}
идентичен на обоих серверах (если вы одновременно развертываете оба сервера)
- если все ваши файлы .css/.js идентичны на обоих серверах (если вы одновременно развертываете оба сервера)
- Если mtime (изменить время) ваших файлов .css/.js одинаково на обоих серверах (ваше развертывание script может повлиять на те и установить текущую дату)
Если все эти требования удовлетворяются, генерируемые файлы должны быть идентичными (содержимое и имена).
Вы можете проверить mtime, используя команду uninstall uninstall.
Ответы на ваши вопросы:
- Назначение кэша в django-компрессоре - это сокращение чтения из файловой системы.
- Сгенерированный файл с комбинированным кодом сохраняется только в файловой системе.
Edit:
Я проверил его на одном из моих сайтов за балансировщиком нагрузки. У меня есть разные имена файлов для .css файлов, но они одинаковы для .js.
Для .css файлов я использую препроцессор (http://lesscss.org/), поэтому он влияет на mtime.
Изменить (после разработки темы):
Что находится в кеше?
Благодаря документации django-compressor хранит в кэше две разные вещи:
- mtime кэшированных файлов (перепроверено каждые секунды COMPRESS_MTIME_DELAY)
-
полностью сгенерированный код, т.е.:
< link rel= "stylesheet" href= "http://cdn.inprl.pl/CACHE/css/117f97d818b8.css" type = "text/css" >
Из-за использования кеша django-компрессор уменьшает количество чтений до файловой системы до 0. Это важно для скорости страницы, потому что чтение из памяти в сотни раз быстрее, чем чтение из файловой системы. Также файловая система очень часто является узким местом.
Как он хранится в кеше?
django-compress хранит код в кеше с помощью сгенерированного ключа. Ключ генерируется из:
- код в
{% compress %}...{% endcompress %}
- mtime файлов, упомянутых в
{% compress %}...{% endcompress %}
Таким образом, они должны быть одинаковыми на всех серверах, если вы хотите иметь согласованные ответы.
PS.
Проверьте ограничения (например, mtime) на своем сервере и отправьте здесь информацию, если они совпадают.
Я буду исправлять ту же проблему на своем сайте, вероятно, на следующей неделе, тогда я отправлю дополнительные данные.
Ответ 2
В ветке разработки есть новая опция для изменения метода хэширования css.
https://github.com/jezdez/django_compressor
См. строка 61 в фильтрах /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
Ответ 3
Что вам нужно сделать, это поместить все сжатые файлы в хранилище вне ваших компьютерных экземпляров, которые находятся за балансировщиком нагрузки. Например, используйте Amazon S3 для хранения всех ваших файлов на другом подобласте, чем остальные приложения.
Итак, http://myapp.com
указывает на ваш балансировщик нагрузки, а http://s3.myapp.com
указывает на ваше хранилище, например Amazon S3. Вам не придется беспокоиться о хранении нескольких разных версий в разных экземплярах.
Здесь вы можете найти полное руководство по настройке Amazon S3, Gzip Compression и django-compressor с Джанго.