Назад | Перейти на главную страницу

Как настроить Nginx как кэширующий обратный прокси?

Недавно я слышал, что Nginx добавил кеширование в свою функцию обратного прокси. Я огляделась, но не нашла много информации об этом.

Я хочу настроить Nginx в качестве обратного прокси-сервера кеширования перед Apache / Django: чтобы иметь запросы прокси-сервера Nginx для некоторых (но не всех) динамических страниц в Apache, затем кэшировать сгенерированные страницы и обслуживать последующие запросы для этих страниц из кеша.

В идеале я бы хотел сделать кеш недействительным двумя способами:

  1. Установите дату истечения срока действия кэшированного элемента
  2. Чтобы явно сделать недействительным кэшированный элемент. Например. если мой бэкэнд Django обновил определенные данные, я бы хотел сказать Nginx, чтобы он аннулировал кеш затронутых страниц

Можно ли настроить на это Nginx? Как?

Я не думаю, что есть способ явно аннулировать кешированные элементы, но вот пример того, как сделать все остальное. Обновить: Как упомянул Петр в другом ответе, есть модуль очистки кеша что вы можете использовать. Вы также можете принудительно обновить кешированный элемент с помощью nginx proxy_cache_bypass - см. Ответ Чериана Чтобы получить больше информации.

В этой конфигурации элементы, которые не кэшируются, будут извлечены из example.net и сохранены. Кэшированные версии будут передаваться будущим клиентам до тех пор, пока они не станут недействительными (60 минут).

Ваши HTTP-заголовки Cache-Control и Expires будут соблюдаться, поэтому, если вы хотите явно установить дату истечения срока действия, вы можете сделать это, установив правильные заголовки во всем, что вы проксируете.

Существует множество параметров, которые вы можете настроить - см. Документацию модуля nginx Proxy для получения дополнительной информации обо всем этом, включая подробности о значении различных настроек / параметров: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

Вы можете конкретно аннулировать кеширование страницы через

proxy_cache_bypass       

Скажем, вы хотите кешировать страницу, установите кеш таким образом

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Теперь, когда ты хочешь аннулировать эту страницу и снова кешировать

Сделайте секретный вызов завитка с заголовком

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Это сделает его недействительным и кэширует.

Работает с nginx 0.7.

В качестве дополнительного бонуса add_header X-Cache-Status может использоваться, чтобы проверить, находится ли страница из кеша или нет.

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

Для вашего второго запроса, явное признание недействительности. Я настоятельно рекомендую изменить имя URL-адреса ресурса, который вы хотите сделать недействительным, либо переименовав файл, либо используя какую-либо форму блокировки кеша строки запроса. Лак действительно имеет PURGE операция, которая удалит ресурс из кеша Varnish, но не даст вам контроля над любыми другими кешами между вами и пользователем. Как вы сказали, вы хотите явно очистить ресурс, стандартные заголовки элементов управления http вам не помогут. В таких случаях самый надежный способ обойти кеширование ресурса - переименовать его.

Большинство инструментов кэширования (Citrix) позволяют принудительно обновить (Ctrl + r) для повторного заполнения кэшированной страницы.

Вот трюк, который я нашел, чтобы сделать нечто подобное в nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Это предполагает, что когда вы нажимаете Ctrl + r в своем браузере, заголовок Cache-Control имеет max-age = 0 в своем запросе. Я знаю, что Chrome делает это, но в других браузерах я не пробовал. Добавить дополнительные поля заголовка можно легко, просто добавив дополнительные операторы if, которые устанавливают $eac переменная до 1.

Для отмены выбранных страниц вы можете использовать патч cache_purge для nginx-0.8.x, который делает именно то, что вы хотите;)

Это доступно Вот.

Кэширование - довольно новая функция в nginx (и пока не так хорошо документирована), но достаточно стабильная для использования в производственной среде.

Я считаю NginxHttpProxyModule способен обрабатывать HTTP-запросы. Ищите директивы, начинающиеся с:

proxy_cache

Да, можно управлять поведением кеша с помощью таких директив, как:

proxy_cache_valid

Основываясь на том факте, что вы не можете найти на него документацию, я бы немного опасался полагаться на него в производственной среде. Вы рассматривали Varnish? Это мой «nginx обратных прокси», маленький, легкий, выполняющий одну работу и выполняющий ее хорошо.

Если вы используете eTags в своем приложении и помещаете перед ним nginx, то оно позаботится об истечении срока действия за вас, потому что, если eTag изменится, это сделает кеш недействительным.

Вы можете контролировать истечение срока действия кеша Nginx с помощью нескольких директив / параметров:

  • proxy_cache_valid 200 302 10m;
  • добавление одного из заголовков HTTP ниже (важен приоритет - проверьте мой пост в блоге):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • в inactive параметр в proxy_cache_path директива:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

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

Тема очистки действительно интересна, поскольку эта функция существует только в Nginx Plus (коммерческая версия Nginx). Мне очень нравится ответ @ randy-wallace. Но есть и другие возможности, такие как модуль ngx_cache_purge.

Самое простое, что вы можете сделать, - это удалить кешированный файл вручную:

  • сгенерируйте свой хеш-ключ:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • удалите файл из файловой системы:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

Для будущих посетителей: обратный прокси-сервер nginx имеет интегрированное кеширование, а документы доступны по адресу:

Синтаксис: зона proxy_cache | выкл;

По умолчанию: proxy_cache выключен;

Контекст: http, сервер, местоположение

Определяет зону общей памяти, используемую для кэширования. Одна и та же зона может использоваться в нескольких местах. Значение параметра может содержать переменные (1.7.9). Параметр off отключает кеширование, унаследованное от предыдущего уровня конфигурации.

fastcgi_cache_path  /opt/nginx-cache  levels=2:2   keys_zone=img:50m;

    location /img/ {
        fastcgi_pass $backend;
        include fcgi_params;
        fastcgi_intercept_errors off;   
        fastcgi_cache_key $server_addr$request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid any 1m;
        fastcgi_hide_header Set-Cookie;
    }

Это создает кеш для / img / location. Он находится в / opt / nginx-cache. Объекты кешируются на 1 минуту.

Вы можете писать разные коды ответов вместо любых.

Теперь вы не можете аннулировать кеш для выбранных страниц. Может быть, в 0.8.x это будет возможно.

Существует плагин nginx под названием ncache который утверждает, что является «базой системы веб-кеширования на веб-сервере nginx. Быстрее и эффективнее, чем squid».