Как переопределить операции plone.app.caching для использования Apache mod_cache с Plone - PullRequest
1 голос
/ 06 июля 2011

Мы запускаем Plone 4.1 с plone.app.caching за Apache 2.2 с mod_cache и mod_disk_cache.

Предопределенные операции, доступные с plone.app.caching, не совсем подходят для этогоконфигурация Apache не будет кэшировать ответы, если max-age = 0, независимо от того, какие значения вы установили для Expires и s-max-age (я думаю, что это противоречит спецификации HTTP 1.1).С Plone 3.3 и CacheFu было просто изменить конфигурацию, чтобы обойти это: установите max-age = 1 для соответствующего набора заголовков.Смотрите эту проблему CacheFu

Я ищу несколько советов, чтобы добиться того же самого с помощью plone.app.caching.Какой самый простой способ переопределить операцию plone.app.caching.moderateCaching, чтобы ее максимальное значение было равно 1, а не 0?

В данный момент мы не рассматриваем возможность добавления Squid или Varnish в наш стек..

Ответы [ 5 ]

2 голосов
/ 27 июля 2011

На самом деле вы запрашиваете strongCaching (но с коротким сроком действия), поэтому используйте его вместо этого. По определению, randomCaching предназначен для «кэширования в браузере, но срок его действия истекает немедленно», другими словами, max-age = 0.

Три операции кэширования по умолчанию - strongCaching, averageCaching и weakCaching - это всего лишь полезные абстракции, разработанные для облегчения понимания вариантов, связанных с назначением политик кэширования. Если абстракции вам не помогают, вы можете делать практически все, что вам нужно, просто используя strongCaching и меняя настройки.

Это обсуждается более подробно в документации plone.app.caching, http://pypi.python.org/pypi/plone.app.caching

0 голосов
/ 13 сентября 2011

После долгих размышлений мы решили эту проблему с помощью некоторой конфигурации Apache. Мы изменили заголовки ответа, чтобы задать для max-age значение 1, если max-age = 0 и s-maxage положительна, а затем удалили заголовок expires:

Header edit Cache-Control max-age=0(.*s-maxage=[1-9].*) max-age=1$1
Header unset Expires

Это делает свое дело, хотя клиенты HTTP 1.0 теперь не будут знать, что Expires будут основывать свое кэширование.

0 голосов
/ 09 сентября 2011

Лоуренс обнаружил для меня соответствующую ошибку Apache https://issues.apache.org/bugzilla/show_bug.cgi?id=35247

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

0 голосов
/ 07 июля 2011

Полагаю, реальный ответ здесь, вероятно, заключается в том, что в данный момент нет простого способа сделать это. Я поднял ошибку Plone, чтобы позволить максимальному возрасту быть переопределенным при умеренном кэшировании

Итак, вот мое решение, которое работает, но кажется много работы по сравнению с возможностью переопределить максимальный возраст по умолчанию при умеренном кэшировании. Я определяю свою собственную операцию кэширования, которая расширяет plone.app.caching.operations.default.moderateCaching:

class CacheInApache(ModerateCaching):
    """ Apache won't cache a response if max-age cache control is 0.  Override ModerateCaching
        and set it to 1 second.
    """
    classProvides(ICachingOperationType)

    title = _(u"Cache in Apache")
    description = _(u"Moderate caching for Plone behind Apache. max-age set to 1")
    prefix = 'cacheInApache'

    maxage = 1  

Зарегистрируйте это в configure.zcml

<adapter factory=".operation.CacheInApache" 
        name="cacheInApache" />
<utility component=".operation.CacheInApache" 
        name="cacheInApache" />

Затем в моем универсальном профиле установки registry.xml я настраиваю свои типы для его использования и определяю его поля.

<record name="plone.caching.interfaces.ICacheSettings.operationMapping">
    <value purge="False">
        <element key="plone.resource">plone.app.caching.strongCaching</element>
        <element key="plone.stableResource">plone.app.caching.strongCaching</element>
        <element key="plone.content.itemView">cacheInApache</element>
        <element key="plone.content.feed">cacheInApache</element>
        <element key="plone.content.folderView">cacheInApache</element>
        <element key="plone.content.file">cacheInApache</element>
    </value>
</record>
<record name="cacheInApache.smaxage">
    <field type="plone.registry.field.Int">
        <title>Shared maximum age</title>
        <description>Time (in seconds) to cache the response in the caching proxy</description>
        <required>False</required>
    </field>
    <value>86400</value>
</record>
<record name="cacheInApache.etags">
    <field type="plone.registry.field.Tuple">
        <title>ETags</title>
        <description>A list of ETag component names to include</description>
        <value_type type="plone.registry.field.ASCIILine" />
        <required>False</required>
    </field>
    <value>
    </value>
</record>
<record name="cacheInApache.lastModified">
    <field type="plone.registry.field.Bool">
        <title>Last-modified validation</title>
        <description>Turn on Last-Modified headers</description>
        <required>False</required>
    </field>
    <value>False</value>
</record>
<record name="cacheInApache.ramCache">
    <field type="plone.registry.field.Bool">
        <title>RAM cache</title>
        <description>Turn on caching in Zope memory</description>
        <required>False</required>
    </field>
    <value>False</value>
</record>
<record name="cacheInApache.vary">
    <field type="plone.registry.field.ASCIILine">
        <title>Vary</title>
        <description>Name(s) of HTTP headers that must match for the caching proxy to return a cached response</description>
        <required>False</required>
    </field>
    <value></value>
</record>
<record name="cacheInApache.anonOnly">
    <field type="plone.registry.field.Bool">
        <title>Only cache for anonymous users</title>
        <description>Ensure logging users always get a fresh page. Note that if you are caching pages in a proxy cache, you'll still need to use a Vary response header to keep anonymous and authenticated content separate.</description>
        <required>False</required>
    </field>
    <value>False</value>
</record>          

Вы также можете определить некоторые переопределения для конкретных типов.

Если кто-нибудь может предложить более простой способ достижения этого, пожалуйста, дайте мне знать

0 голосов
/ 06 июля 2011

Это все настраиваемая политика. Вы можете установить его в панели управления или (как я предпочитаю) в общей настройке registry.xml. См. Пример политики в plone.app.caching.

Обновление:

Панель управления пытается упростить ситуацию, ограничив то, что установлено в политиках кэширования по умолчанию. Тем не менее, все еще возможно изменить их непосредственно в реестре, поэтому вы можете использовать следующее в вашем registry.xml:

<record name="plone.app.caching.moderateCaching.maxage">
    <field type="plone.registry.field.Int">
        <title>Maximum age</title>
        <description>Time (in seconds) to cache the response in the browser or caching proxy</description>
        <required>False</required>
    </field>
    <value>1</value>
</record>
...