Вопрос: Как настроить Nginx в качестве кэширующего обратного прокси?


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

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

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

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

Можно ли установить Nginx для этого? Как?


138
2018-06-24 01:35


Источник




Ответы:


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

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

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

Есть много параметров, которые вы можете настроить - см. Документацию модуля 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;
    }
  }
}

94
2017-09-23 20:01



Это разумный первый шаг для новых приложений, у которых нет 20k / req / s. - Barry
@Barry, какой будет второй steP? - Jürgen Paul
@Legit - я не знаю, но традиционно последним шагом является «Прибыль» :-) - Stephen C
К сожалению, это не работает с nginx 1.11. Поскольку последнее обновление было около 3 лет назад, похоже, что это уже не решение. - izogfif


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

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 может использоваться для проверки того, находится ли страница в кеше или нет.


46
2017-11-26 04:00



Это может обновлять только кешированные страницы, когда новая страница также кэшируется. Если вы удалили страницу (404 или другие ошибки теперь обслуживаются бэкэнд), страница теперь отправляет Set-Cookie или заголовок «Content-Control: private», кешированный контент не будет «аннулирован». - rbu


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

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


36
2018-06-24 02:43



Не могли бы вы объяснить, что вы имели в виду под «переименованием файла или использованием какой-либо формы кеша строки запроса»? Я не уверен, что понимаю, почему не рекомендуется использовать такую ​​операцию, как PURGE. - Continuation
+1 для лака. Всегда лучше использовать нужные инструменты для работы. - Tom O'Connor
@below: почти нет надежды на касание лака на аренах производительности и универсальности. Это подтверждается одним из ведущих разработчиков ядра FreeBSD и специальной командой, работающей в Европе. Лак находится в производстве в twitter, heroku и многих других. - Barry
Самый простой пример кэширования - добавить номер версии в строку запроса к статическому ресурсу, поэтому style.css становится style.css? 123. Когда вы хотите нажать новую версию файла, вы измените URL-адрес ресурса на style.css? 124, и теперь кэши заберут его как совершенно новый актив, который будет кэшироваться отдельно. Apache будет обслуживать файл style.css с любой добавленной строкой запроса, поэтому никаких изменений в фактическом файле не требуется. - chmac
Если возможно, лучше поместить загрузчик кеша в самое имя файла, например style.v123.css потому что некоторые кэши не будут кэшировать запросы с строкой запроса. - Noah McIlraith


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

Он доступен Вот,


7
2017-11-17 07:38





Большинство инструментов кеширования (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 имеет максимальный возраст = 0 в своем запросе. Я знаю, что Chrome делает это, но я не пробовал в других браузерах. Добавление большего количества полей заголовка может быть простым, просто добавив больше операторов if, которые устанавливают $eac переменная до 1.


6
2018-04-10 23:02





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


4
2018-06-24 02:25





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

proxy_cache

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

proxy_cache_valid

3
2018-06-24 10:12