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

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

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

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

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

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

138 голосов | спросил Continuation 24 J0000006Europe/Moscow 2009, 05:35:45

12 ответов


94

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

В этой конфигурации элементы, которые не кэшируются, будут извлекаться из 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;


  сервер {
    место нахождения /{
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid 200 302 60 м;
      proxy_cache_valid 404 1 м;
    }
  }
}
 
ответил Casey 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 24 Sep 2009 00:01:54 +0400 2009, 00:01:54
46

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

  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 с заголовком

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

Это приведет к аннулированию и кешированию.

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

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

ответил Cherian 26 62011vEurope/Moscow11bEurope/MoscowSat, 26 Nov 2011 08:00:25 +0400 2011, 08:00:25
36

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

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

ответил Dave Cheney 24 J0000006Europe/Moscow 2009, 06:43:02
7

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

Доступно здесь .

ответил 17 22009vEurope/Moscow11bEurope/MoscowTue, 17 Nov 2009 10:38:50 +0300 2009, 10:38:50
6

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

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

  server {
        # Другие настройки
        proxy_pass_header Set-Cookie; # Я хочу кэшировать зарегистрированных пользователей
        proxy_ignore_headers X-Accel-Redirect;
        proxy_ignore_headers X-Accel-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 в значение.

ответил Randy Wallace 11 AMpWed, 11 Apr 2012 03:02:24 +040002Wednesday 2012, 03:02:24
4

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

ответил SaveTheRbtz 24 J0000006Europe/Moscow 2009, 06:25:22
3

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

  proxy_cache
 

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

  proxy_cache_valid
 
ответил Taras Chuhay 24 J0000006Europe/Moscow 2009, 14:12:59
2

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

ответил womble 24 J0000006Europe/Moscow 2009, 05:38:12
1

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

ответил Martin Murphy 16 12009vEurope/Moscow11bEurope/MoscowMon, 16 Nov 2009 18:20:01 +0300 2009, 18:20:01
1

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

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

    proxy_cache_path /data /nginx /cache keys_zone = один: 10 м неактивный = 60 м;

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

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

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

  • сгенерируйте хэш-код:

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

      rm /data /nginx /cache /1/27 /2bba799df783554d8402137ca199a271
     
ответил czerasz 31 MarpmTue, 31 Mar 2015 21:06:34 +03002015-03-31T21:06:34+03:0009 2015, 21:06:34
0
fastcgi_cache_path /opt /nginx-cache levels = 2: 2 keys_zone = img: 50m;

    location /img /{
        fastcgi_pass $ backend;
        включить fcgi_params;
        fastcgi_intercept_errors off;
        fastcgi_cache_key $ server_addr $ request_uri;
        fastcgi_cache img;
        fastcgi_cache_valid любой 1м;
        fastcgi_hide_header Set-Cookie;
    }

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

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

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

ответил lexsys 24 J0000006Europe/Moscow 2009, 12:59:25
0

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

ответил sajal 13 J000000Monday09 2009, 03:17:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132