Обновление кэша nginx 0.7.X засчет заголовков запроса

Igor Sysoev is at rambler-co.ru
Mon Jun 22 17:11:40 MSD 2009


On Mon, Jun 22, 2009 at 02:03:01PM +0600, Mike Kazantsev wrote:

> 
> Добрый день,
> 
> Подскажите, как заставить nginx седьмой ветки не использовать свой кэш,
> если пользователь нажимает Ctrl+F5 в браузере?
> 
> Ситуация такова:
> Стоит nginx (стоял 0.6.X) в качестве фронтенда (reverse-proxy) на
> порте 80, за ним apache на 90 порте. Обновили nginx до 0.7.60 для того,
> чтобы кэшировать им статику. Настройки:
> 
> 
>   proxy_cache_path /path/cache-nginx
>                    levels=1:2 keys_zone=cache_main:10m inactive=1d
>                    max_size=5g;
>   proxy_temp_path /path/cache-nginx/tmp;
>   proxy_cache_min_uses 1;
>   proxy_cache_valid 6h;
>   
>   
>   server {
> 
>     location ~* \.(css|gif|jpeg|jpg|<...>)$ {
>       proxy_cache cache_main;
>       proxy_pass http://${ipaddr}:90;
>     }
>   
>     ...
>   
>   }
> 
> 
> Кэш пишется.
> Тесты показали что если из апача передаются "Cache-Control: no-cache"
> или устаревший Expires, то nginx ничего не кэширует, что также нужно.
> 
> Но есть и статика, которую нужно обновлять по требованию пользователя -
> когда он жмет Ctrl+F5 в браузере (или просто F5 в opera). Firefox
> передает "Cache-Control: no-cache" и "Pragma: no-cache", но nginx не
> подключается к апачу, просто отдавая файл из кэша.
> 
> Хочется, чтобы при виде этих заголовков от клиента, nginx, как и в
> случае с заголовками от бэкенда, тоже забывал что у него есть кэш и
> делал честный запрос (с этими же заголовками) к бэкенду, который уже
> отдаст обновленный кусок статики, который заменит то, что лежало в кэше
> nginx до этого.
> 
> Задача выглядит тривиально, но ни документация ни гугл почемуто ответов
> мне не дали.
> Если данный функционал не реализован, то может кивнете в какое место
> кода такую проверку лучше вставить? Пока что в код не смотрел.
> 
> Заранее спасибо за любую информацию.
> 
> 
> Система:
>   nginx-0.7.60 (собран через "./configure --with-http_ssl_module")
>   freebsd-6.3, x86-32
>   apache-1 и apache-2 в качестве бэкендов на разные vhost'ы

Сейчас nginx игнорирует "Cache-Control: no-cache", пришедший от клиента.
Я планирую сделать поддержку обновления кэша с ограниченим, что-то вроде

   server {

      proxy_cache_reload {
          192.168.1.0/24;
          ...
      }

В этом случае запрос уйдёт на бэкенд и, если ответ будет успешным, то
кэш обновится. Пока же ответ обновляется, все получают старый ответ.


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





More information about the nginx-ru mailing list