Як налаштувати Nginx як кешування зворотного проксі?


143

Нещодавно я чув, що Nginx додав кешування до своєї функції зворотного проксі. Я озирнувся, але не зміг знайти багато інформації про це.

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

В ідеалі я хочу скасувати кеш-пам'ять двома способами:

  1. Встановіть термін придатності для кешованого елемента
  2. Щоб явно визнати недійсним кешований елемент. Наприклад, якщо мій сервер Django оновив певні дані, я хотів би сказати Nginx, щоб він визнав недійсним кеш сторінок, на які вони постраждали.

Чи можна встановити Nginx для цього? Як?


Не перевірено, але з gumroad.com/l/ngx_purge : "ngx_purge - це чистий модуль Lua для Nginx, який дозволяє користувачеві очищати об'єкт з кешу nginx."
Хайме Хаблуцель

Відповіді:


97

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

У цій конфігурації елементи, які не є кешованими, будуть вилучені з example.net та збережені. Кешовані версії подаватимуться майбутнім клієнтам до тих пір, поки вони не стануть дійсними (60 хвилин).

Ваші 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;
    }
  }
}

7
Це розумний перший крок для нових програм, які не мають 20k / req / s.

5
@Barry, що буде другим кроком?
Юрген Пол

42
@Legit - Я не знаю, але традиційно останній крок - "Прибуток" :-)
Стівен C

На жаль, він не працює з nginx 1.11. Оскільки останнє оновлення було близько 3 років тому, схоже, це вже не рішення.
izogfif

Що означає: inactive=600mозначає? Хіба не inactiveприйде час? `[inactive=time]
NeverEndingQueue

47

Ви можете спеціально визнати недійсними кешовані сторінки наскрізь

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можна використовувати, щоб перевірити, чи є сторінка з кешу чи ні.


Це може оновлювати кешовані сторінки лише тоді, коли нова сторінка також є кешованою. Якщо ви видалили сторінку (404 або інші помилки зараз подаються за допомогою бекенда), тепер сторінка надсилає Set-Cookie або заголовок "Content-Control: private", кешований вміст не буде "недійсним".
rbu

36

Я пропоную вам спробувати Варніш . Лак спеціально розроблений як зворотний кеш-проксі. Він буде шанувати всі заголовки кеш-керування, які ви надсилаєте з початкового сервера, що задовольняє ваш перший запит.

Для вашого другого запиту явна недійсна. Моя настійна рекомендація - змінити ім'я URL-адреси ресурсу, який ви хочете визнати недійсним, або перейменувавши файл, або скориставшись певною формою кестера кешу рядка запитів. У лаку є PURGEоперація, яка видалить ресурс з кешу Varnish, але він не дасть вам контролю над іншими кешами між вами та користувачем. Як ви вже говорили, що хочете явно очистити ресурс, стандартні заголовки керування http не допоможуть вам. У таких випадках найбезпечніший спосіб перемогти кешування ресурсу - це перейменування його.


Чи можете ви пояснити, що ви мали на увазі, "перейменувавши файл або використовуючи якусь форму кестера кешу рядка запитів"? Я не впевнений, що розумію, чому не годиться використовувати операцію типу PURGE.
Продовження

5
+1 для лаку. Завжди набагато краще використовувати правильні інструменти для роботи.
Том О'Коннор

4
@below: майже не сподіваємось торкнутися лаку на аренах продуктивності та універсальності. Це підтримується одним із провідних розробників ядер FreeBSD та спеціалізованою командою, що базується в Європі. Лак випускається у твіттері, героїці та багатьох інших.

2
Найпростіший приклад кеш-кестера - додати номер версії в рядку запиту до статичного ресурсу, тому style.css стає style.css? 123. Коли ви хочете натиснути нову версію файлу, ви зміните URL-адресу ресурсу на style.css? 124, і тепер кеші підберуть його як абсолютно новий актив, який потрібно кешувати окремо. Apache буде обслуговувати файл style.css із доданим будь-яким рядком запиту, тому ніяких змін до фактичного файлу не потрібно.
chmac

3
Якщо можливо, найкраще помістити кеш-пам’ять у саме ім’я файлу, наприклад, style.v123.cssтому що деякі кеші не кешуватимуть запити, які містять рядок запиту.
Ной Макілрейт

8

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

Він доступний тут .


8

Більшість інструментів кешування (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 це робить, але я не намагався в інших браузерах. Додавання більше полів заголовка може бути простим, просто додавши більше, якщо заяви, які встановлюють $eacзмінну в 1.


5

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


4

Я вважаю, що NginxHttpProxyModule здатний кешувати http-запити. Шукайте директиви, що починаються з:

proxy_cache

Так, можна керувати кеш-поведінкою за допомогою таких директив, як:

proxy_cache_valid

3

Виходячи з того, що ви не можете знайти документи на ньому, я б трохи насторожився, покладаючись на це у виробництві. Чи вважали ви лаком? Це мій "nginx зворотних проксі", маленький, легкий, виконуючи одну роботу і роблячи це добре.



2

Якщо ви використовуєте eTags у вашій програмі і покладете nginx перед нею, то вона подбає про закінчення терміну для вас, тому що якщо зміни eTag змінить кеш-пам'ять.


Дійсно? Схоже, що ngnix збігається з етагом, і ніколи не спілкується з додатком, щоб з’ясувати, чи є оновлений етаг.
Джон Найгл

2

Ви можете керувати закінченням кешу 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
    

1

Для майбутніх відвідувачів: Тим часом зворотний проксі-сервер nginx інтегровано кешування, а документи доступні за адресою:

Синтаксис: proxy_cache zone | вимкнено;

За замовчуванням: proxy_cache вимкнено;

Контекст: http, сервер, місцезнаходження

Визначає зону спільної пам'яті, яка використовується для кешування. Одна і та ж зона може використовуватися в декількох місцях. Значення параметра може містити змінні (1.7.9). Параметр off вимикає кешування, успадковане з попереднього рівня конфігурації.


Привіт, Тарику, питання було дуже конкретним щодо того, чого потрібно досягти, і це трохи більше, ніж "просто включити кеш".
асдмін

0
fastcgi_cache_path / opt / nginx-кеш рівнів = 2: 2 keys_zone = img: 50m;

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

Це створює кеш для / img / location. Це в / opt / nginx-кеш. Об'єкти кешуються протягом 1 хвилини.

Ви можете писати різні коди відповідей замість будь-яких.

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


Первісне питання стосувалося використання nginx перед Apache, а не перед програмою fastcgi, якою керує nginx.
Грем Дамплетон

0

Існує плагін nginx під назвою ncache, який стверджує, що є "системою веб-кеша на веб-сервері nginx. Швидше і ефективніше, ніж кальмари".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.