У меня есть большой (несколько мегабайт) XML-файл, который обновляется довольно часто (каждые 10 минут или меньше) и получает много трафика. Я хотел бы реализовать кеширование, чтобы уменьшить пропускную способность и нагрузку на сервер. Глядя на документы Apache, я вижу головокружительный массив параметров конфигурации, которые включают различные комбинации mod_expires, mod_headers и mod_cache (и варианты). Я бегаю по кругу, и результаты не такие, как я ожидал.
Мне удобно редактировать различные файлы конфигурации, если я знаю, что мне нужно изменить. Но сейчас я копаюсь в темноте, и это никогда не бывает комфортным ощущением. Итак, возможно, если я опишу то, что я хочу, кто-нибудь из присутствующих возьмет меня за руку и скажет: «Это то, что вам нужно сделать».
Периодически этот файл, назовем его "stuff.xml", обновляется, и в каталог копируется новая версия. Внешний URL-адрес может быть, например, http://example.com/stuff.xml. Поймите, эта часть работает. Всякий раз, когда я запрашиваю файл, я получаю ожидаемый результат. Но файл большой, и я хочу сэкономить трафик, поэтому сначала я хотел бы реализовать условную семантику GET с заголовком If-Modified-Since. Как мне это сделать? Я включил mod_headers и mod_expired и добавил <FilesMatching>
в моем httpd.conf, как рекомендовано в бесчисленных примерах, которые я видел в Интернете, но это не изменило поведения при выполнении условного запроса GET. Я всегда получаю статус 200 со всем документом. Так как же мне это реализовать?
Это сократит количество бесполезных переводов. Я также хотел бы ограничить объем передаваемых данных. Поскольку это XML, его сжатие должно сэкономить 50% или больше. Следующим шагом я мог бы как-нибудь сжать файл и, если это не слишком сложно, сохранить его в памяти. Это сократит передачу данных при каждом доступе, а также сократит передачу данных с диска. Итак, как мне реализовать этот тип кеширования?
Заранее спасибо.
Я настроил кеширование с помощью mod_expiresв определении <VirtualHost>
ExpiresActive on
ExpiresByType text/xml "modified plus 5 minutes"
Вы можете настроить сжатие, используя mod_deflate
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/xml
Что касается того, почему If-Modified-Since не работает, я думаю, вам следует опубликовать соответствующие части своей конфигурации (я предполагаю, что вы перезапустили Apache). Вы также можете быстро проанализировать журналы, чтобы увидеть, получает ли один и тот же IP-адрес (возможно, один и тот же пользователь) этот XML-файл несколько раз. Если это всегда или в основном новые пользователи каждый раз, кеш на стороне клиента не поможет снизить нагрузку на ваш сервер.
Для сжатия вы хотите изучить mod_deflate и / или mod_gzip. Вот это более раннее сравнение журнала Linux.
Что касается кеширования памяти, я думаю, что если к нему обращаются достаточно, чтобы кешировать, ОС, вероятно, уже кэширует его. Если у вас нет проблем с вводом-выводом или плохой задержки в файле, я бы доверял ОС делать свою работу.