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

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

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

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

  • Какова реальная цель кеша в компрессоре django?
  • Is the file content stored in both cache and on filesystem?
    • If so, which happens first?
  • Надеюсь, я задаю здесь правильные вопросы. Не стесняйтесь добавлять некоторые.

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

Изменить

  • Поскольку оба сервера совместно используют сервер memcached, следует ли установить COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.socket_cachekey' (см. ветку разработки) или использование одного и того же ключа кэша способствует тому, что у меня одинаковые имена файлов?
  • The way I understand this, mtime is collected from the source js/css files to determine if they may have changed and a new file should be generated out of them. Correct?
    • This probably does not happen on each and every load. When does it happen?

person demux    schedule 30.08.2011    source источник
comment
Если бы я был на вашем месте и хотел бы узнать такие подробности о django-compressor, я бы прочитал код (код django-compressor).   -  person Tomasz Wysocki    schedule 30.08.2011
comment
Я уже сделал это. Но хотя я могу частично понять, что делает большая часть кода, я не могу понять общую картину этого, если вы понимаете, о чем я. Поэтому я подумал: может быть, кто-то работал с django-compressor больше, чем я, и может объяснить мне, как он работает, чтобы я мог лучше понять, что делать с кодом, глядя на него.   -  person demux    schedule 31.08.2011


Ответы (3)


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

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

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

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

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

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

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

Изменить:

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

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

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

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

Из-за документации django-compressor хранит в кеше две разные вещи:

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

    ‹ссылка rel="stylesheet" href="http://cdn.inprl.pl/CACHE/css/117f97d818b8.css" type="text/css">

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

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

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

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

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

ПС.

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

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

person Tomasz Wysocki    schedule 30.08.2011
comment
Спасибо за ваш ответ. Да, сокращение операций чтения из файловых систем, это может быть хорошо, но на самом деле это не так сильно ускоряет работу, если только это не препятствует запуску некоторого кода и использованию ресурсов. Но это было не то, о чем я просил. Я хочу знать, что хранится в кеше и для чего он используется. Я предполагаю, что это как-то связано с процессом определения необходимости создания новых файлов. - person demux; 31.08.2011

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

См. строку 61 в filter/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.

Это отлично работает за моим балансировщиком нагрузки.

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

person demux    schedule 05.09.2011

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

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

Здесь вы можете найти полное руководство. как настроить Amazon S3, сжатие Gzip и django-compressor с помощью Django.

person Marcus Lind    schedule 06.05.2015
comment
Лол, бесстыдная самореклама. Но да, в целом это хороший совет, хотя это не совсем ответ на исходный вопрос. В моем конкретном случае, еще в 2011 году, компания, в которой я работал, работала с местной хостинговой компанией, которая не предоставляла такого рода хостинг контента. Вот, печенье! +1 :D - person demux; 06.05.2015