The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Организация кэширования только медленных ответов сервера при помощи Nginx
Пример организации на стороне фронтэнда кэширования контента, который начинает
отдаётся бэкендом дольше, чем через 3 секунды. Запросы, которые отдаются менее,
чем за 3 секунды передаются клиенту минуя кэш. Время жизни записи в кэше
составляет 60 секунд. Для расчёта времени отдачи используются два блока vhost
с передачей переменной со временем задержки в заголовке X-Accel-Expires,
созданной при помощи директивы "map".

   proxy_cache_path /home/tmpcache/mycache levels=1:2 keys_zone=example:10m;

   # Для запросов дольше 3 секунд устанавливаем время жизни записи в кэше в 60 секунд, иначе 0 (отдаём минуя кэш).
   map $request_time $longtime {
       "~^([3-9]|[1-9][0-9]+)\\." 60;
       default 0;    
   }

   server {
       listen 127.0.0.1:8888;
       root /var/www/;
       server_name example.com; 
       location / { 
           proxy_redirect          off;
           proxy_set_header        Host $host;
           proxy_pass              http://mybackend;
           add_header X-Accel-Expires $longtime;
       }
   }

   server {
       listen 8080;
       root /var/www/;
       server_name example.com; 
       location / { 
           proxy_redirect          off;
           proxy_set_header        Host $host;
           proxy_pass              http://127.0.0.1:8888;
           proxy_cache             example;
           proxy_cache_valid       200 0m;
           add_header X-Cached $upstream_cache_status;
           add_header X-Time $request_time;
        }
   }


Проверка:

   # curl -I "http://example.com:8080/mylongrequest" 

   ...
   X-Cached: MISS
   X-Time: 11.862

повторный запрос будет выдан из кэша:

   # curl -I "http://example.com:8080/mylongrequest" 
   ...
   X-Cached: HIT
   X-Time: 0.000
 
01.10.2014 , Источник: http://blog.alteroot.org/articles/2...
Ключи: nginx, cache / Лицензия: CC-BY
Раздел:    Корень / Администратору / Сетевые сервисы / WWW, Apache httpd / Редирект, mod_rewrite

Обсуждение [ RSS ]
  • 1.1, pavlinux (ok), 16:47, 02/10/2014 [ответить]  
  • +/
    Кэш придумали для упрощения (ускорения) доступа к часто использованным данным.
    Тут предлагают замедлять тех, кто быстрый и ускорять тормозов.

    Теперь я понимаю, откуда столько новых сайтов, с временем загрузки до 30 сек,
    буквально на ровном месте. :)

    Задача сервера какая? Всех выровнять по скорости иль всё ж отдать контент как можно быстрее?

     
     
  • 2.2, Crazy Alex (ok), 19:43, 02/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Как по мне - удобный _дешевый_ способ ускорить отдачу, не забивая без надобности и не выискивая руками, что именно тормозит.
     
  • 2.3, Аноним (-), 20:33, 02/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Ты чего, каркуша? Оно как раз ускоряет то что тормозит. Правда, такой подход к кэшированию достаточно безбашенный и может больно укатать ручкой грабель в лоб, закэшировав лишку.
     
     
  • 3.4, pavlinux (ok), 04:48, 03/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    >Оно как раз ускоряет то что тормозит.

    Ты какой местой читаешь?

    > "... предлагают замедлять тех, кто быстрый и ускорять тормозов."

    Ну и второе: Если контент и так в кэше, из-за медленных, то нафига другим формировать заново?!

     
     
  • 4.5, Аноним (-), 06:40, 06/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Ты чего-то не понял: этот "хакир" детектирует запросы которые бэкэнд жевал более чем X и такие запросы попадают в кэш, разгружая бэкэнд. Скорость клиентов тут вообще не при чем - я так понимаю что пытаются замерять время отработки бэкэндом, для чего сгорожен хак с проксированием сначала сам на себя а потом на бэкэнд.
     

  • 1.6, _ (??), 07:35, 07/10/2014 [ответить]  
  • +1 +/
    Почему нельзя вообще все отдавать из кэша, разгрузив тем самым бэкэнд?
    Если ответ содержит данные можно кэшировать, давайте кэшировать все. Бэкэнд скажет только спасибо.
    Если ответ содержит данные, которые нельзя кэшировать (данные аккаунта), то тогда их и при залипании ответа кэшировать нельзя.
    Какая прикладная задача тут решается?
     
     
  • 2.7, edwin3d (ok), 11:20, 08/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Можно предположить, что в самом приложении (к примеру генерирует аналитику) есть участки, которые работают "тяжко".
    Вот Вам так сказать пример:
    У меня были похожая ситуация, когда давно было одно приложение, так там были графики, которые рисовались по 7-8 сек (графики были сложные).
    Аналогично было с экспортом некоторых данных ...
    Короче - решение интересное, применимо не везде, но с умом может принести много пользы
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру