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