Пожелание по mod_rewrite

Igor Sysoev is at rambler-co.ru
Tue Mar 15 21:30:29 MSK 2005


On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:

> Igor Sysoev пишет:
>> On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:
>> 
>>> Igor Sysoev пишет:
>>> 
>>>> On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:
>>>> 
>>>>> Igor Sysoev пишет:
>>>>> 
>>>>>> On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:
>>>>>> 
>>>>>>> Igor Sysoev пишет:
>>>>>>> 
>>>>>>>> On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:
>>>>>>>> 
>>>>>>>>> Igor Sysoev пишет:
>>>>>>>>> 
>>>>>>>>>> On Tue, 15 Mar 2005, Andrew Velikoredchanin wrote:
>>>>>>>>>> 
>>>>>>>>>>> Boguk Maxim пишет:
>>>>>>>>>>> 
>>>>>>>>>>>> Генератор статического HTML и кеширование с возможностью сброса 
>>>>>>>>>>>> отдельных
>>>>>>>>>>>> документов по инициативе backend почти одно и тоже.
>>>>>>>>>>>> При этом кеширование не генерирует заведомо не используемые 
>>>>>>>>>>>> страницы в
>>>>>>>>>>>> отличии от генераторов статического html.
>>>>>>>>>>>> В общем реально надо механизм сброса части кеша по regexp по 
>>>>>>>>>>>> инициативе
>>>>>>>>>>>> backend вот.
>>>>>>>>>>>> (полный сброс не предлагать при обьеме кеша 10Gb+ :))
>>>>>>>>>>>> Мне бы тоже пригодилось.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Ну, скажем, не со стороны бэкэнда, а со стороны вообще. :) Как 
>>>>>>>>>>> вариант - введение условий либо в механизм кэша, либо в 
>>>>>>>>>>> mod_rewrite.
>>>>>>>>>>> 
>>>>>>>>>>> Кстати, Игорь. Если делать механизм условного кэширования на 
>>>>>>>>>>> основе времени спец. файла и времени кэша текущего файла, то надо 
>>>>>>>>>>> учитывать что путь к спец. файлу должен строиться на основе url. 
>>>>>>>>>>> Только вот без regexp думаю, здесь не обойтись. Т.к. при 
>>>>>>>>>>> необходимости введения спец. файла для каталогов нужно иметь 
>>>>>>>>>>> возможность указывать не весь url, а с учетом уровня вложенности.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Файлы ограничивают использование одной машиной. regex'ы 
>>>>>>>>>> использовать
>>>>>>>>>> нереально. Я вижу такое решение: нужно добавлять в заголовок ответа 
>>>>>>>>>> ключ(и),
>>>>>>>>>> от которого зависит кэширование. Запросы, после которых часть 
>>>>>>>>>> ответов
>>>>>>>>>> становятся неверными (например, POST'ы), должны передавать такой же 
>>>>>>>>>> ключ.
>>>>>>>>>> Эти ключи будут храниться в своём кеше.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Игорь, извини, но ничего не понял. Как в таком режиме из стороннего 
>>>>>>>>> скрипта, который выполняется на сервере по крону указать что 
>>>>>>>>> определення группа файлов в кэше уже не актуальна?
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Сторонние скрипты не нужны. Бэкенд в ответе передаёт заголовок
>>>>>>>> "X-Accel-Key: <md5> <md5> ...". При проверке закэшированного ответа
>>>>>>>> будут также проверяться время обноволения каждого ключа. Если ответ
>>>>>>>> старше, чем любой ключ, то запрос уходит к бэкенду. Запросы, которые
>>>>>>>> могут повлиять на подобные закэшированные ответы, должны содержать
>>>>>>>> специальное поле с ключом. При получении такого запроса ставится 
>>>>>>>> новое
>>>>>>>> время для данного ключа.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Эти ключи как я понимаю, будут формироваться скриптом. Для меня этот 
>>>>>>> вариант не подходит, т.к. я хочу макимально избавиться от скриптов. А 
>>>>>>> так на каждый запрос скрипт будет вызываться. :(
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Ключи формируются бэкендом.
>>>>> 
>>>>> 
>>>>> 
>>>>> Тогда не понял. Бэкенд это апачь. Откуда он будет брать нужные значения 
>>>>> ключей? Кроме того, как он их будет формировать, если при генерации 
>>>>> страници неизвестно когда потребуется ее опять сгенерировать (т.е. когда 
>>>>> обновяться данные)?
>>>> 
>>>> 
>>>> 
>>>> Ключи берутся оттуда же, откуда предполагается брать спец.файлы, с 
>>>> помощью
>>>> которых проверяется правильность ответов. Ключ можно формировать так же,
>>>> как предполагается формировать имена этих файлов.
>>> 
>>> 
>>> Эти спец. файлы предполагается генерировать оффлайновыми скриптами, 
>>> которые обрабатывают данные (конкретно - добавляют новые данные).
>> 
>> 
>> Тогда эти скрипты могут делать простой GET с ключом, чтобы nginx
>> обновлял время для ключа. На бэкенд запрос можно даже не передавать.
>> 
>>>> Ключ - это не время
>>>> кэширования. Это просто ключ. У него есть время его обновления. А сам 
>>>> ключ
>>>> неизменен.
>>> 
>>> 
>>> Т.е. фактически это получается типа указания, что в определенное заранее 
>>> известное время страницы с привязанными к этому времени ключами должны 
>>> потерять актуальность? Все одновременно? В принципе, это устранит проблему 
>>> синхронизации данных между страницами большого списка.
>> 
>> 
>> Нет, если опредёленное время заранее известно, то бэкенд для всех
>> таких страниц может выдавать соответствующий X-Accel-Expire.
>> Ключ нужен для ситуация, когда время устаревания неизвестно, а зависит
>> от клиентов, пример - форум с закэшированным обсуждением. При постинге
>> новых данных закэшированные данные нужно обновить.
>> 
>>> Так. А может быть тогда получится указать бэкенду динамически что 
>>> определенный ключь утратил актуальность и надо сбросить кэшь с данным 
>>> ключем? Т.е. то, что предлагал Максим, но оперировать уже не uri, а вот 
>>> этими твоими ключами.
>> 
>> 
>> Указывать нужно не бэкенду, а nginx'у. Да, можно - простой GET.
>
> Во! Вот теперь понял.
>
> Т.е. при выдаче страницы с бэкэнда генерирую два ключа. Один уникальный для 
> страницы, другой для группы, к которой эта страница принадлежит (я так думаю, 
> что к-во ключей по возможности лучше не ограничивать или ограничит 4-мя или 
> 8-ю - это уж смотри сам).
>
> Потом, когда я дам специальную команду nginx с упоминанием одного из этих 
> ключей, кэши в которых они упомянаются обновяться.
>
> Все верно?

За одним исключением - файлы кэше не обновятся, а будут помечены как
устаревшие. Обновятся они только при запросе.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list