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

nginx proxy_cache: ограничить параллельные запросы для одного и того же URL

Мы используем nginx в качестве обратного прокси для получения файлов с вышестоящих серверов. Файлы не являются динамическими - по крайней мере, не для каждого запроса - и (иногда) имеют большую задержку.

Я хотел бы ограничить запрос того же URL до 1.

Пример поведения, которого я хочу избежать:

127.0.0.1 - - [03/Jan/2013:16:08:15 +0100] "GET /part-00132.ts HTTP/1.0" 200 1506068 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:28 +0100] "GET /part-00133.ts HTTP/1.0" 200 1189476 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:29 +0100] "GET /part-00133.ts HTTP/1.0" 200 1189476 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" "-"
127.0.0.1 - - [03/Jan/2013:16:08:34 +0100] "GET /part-00133.ts HTTP/1.0" 200 1189476 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:44 +0100] "GET /part-00134.ts HTTP/1.0" 200 1762876 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" "-"
127.0.0.1 - - [03/Jan/2013:16:08:53 +0100] "GET /part-00135.ts HTTP/1.0" 200 1627704 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:59 +0100] "GET /part-00136.ts HTTP/1.0" 200 1252456 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:03 +0100] "GET /part-00134.ts HTTP/1.0" 200 1762876 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:04 +0100] "GET /part-00137.ts HTTP/1.0" 200 1120292 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:07 +0100] "GET /part-00135.ts HTTP/1.0" 200 1627704 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" "-"
127.0.0.1 - - [03/Jan/2013:16:09:12 +0100] "GET /part-00134.ts HTTP/1.0" 200 1762876 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:14 +0100] "GET /part-00136.ts HTTP/1.0" 200 1252456 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:17 +0100] "GET /part-00135.ts HTTP/1.0" 200 1627704 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:17 +0100] "GET /part-00138.ts HTTP/1.0" 200 1248884 "-" "Prefetch" "-"

Должно получиться так:

127.0.0.1 - - [03/Jan/2013:16:08:15 +0100] "GET /part-00132.ts HTTP/1.0" 200 1506068 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:28 +0100] "GET /part-00133.ts HTTP/1.0" 200 1189476 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:44 +0100] "GET /part-00134.ts HTTP/1.0" 200 1762876 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" "-"
127.0.0.1 - - [03/Jan/2013:16:08:53 +0100] "GET /part-00135.ts HTTP/1.0" 200 1627704 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:08:59 +0100] "GET /part-00136.ts HTTP/1.0" 200 1252456 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:04 +0100] "GET /part-00137.ts HTTP/1.0" 200 1120292 "-" "Prefetch" "-"
127.0.0.1 - - [03/Jan/2013:16:09:17 +0100] "GET /part-00138.ts HTTP/1.0" 200 1248884 "-" "Prefetch" "-"

Обновить:

Схема для краткого описания проблемы:

            nginx              upstream
           +-----+            +--------+
           |     |            |        |
   A +----->     +-----------------+   |
           |     |            |    |   |
   B +----->     +--------------+  |   |
           |     |            | |  |   |
     <-----+     <--------------|--+   |
           |     |            | |      |
     <-----+     <--------------+      |
           |     |            |        |
   C +----->     +---+        |        |
           |     |   |        |        |
     <-----+     <---+        |        |
           |     |            |        |
           +-----+            +--------+

Итак, я хочу клиента B ждать A ответ.

Одно из возможных решений для вас - кеширование. При использовании прокси-передачи или передачи fcgi с nginx у вас есть возможность кэшировать возвращаемые данные в течение определенного периода времени. Подробнее об этом можно прочитать в документации: прокси и версия fcgi. По принципу работы они практически идентичны друг другу.

Я также предлагаю поискать несколько руководств по нему, поскольку то, как части кеширующих агентов работают вместе, не совсем тривиально из документации.

Но основная идея состоит в том, что вы делаете прокси «ключ» из своего URL (в вашем случае). И вы можете затем настроить его на кеширование на 10 минут или что-то в этом роде. Таким образом, последующие вызовы обслуживаются из локального кеша вместо того, чтобы получать его снова.

Затем вы можете предотвратить последующие запросы во время обновления, установив:

proxy_cache_use_stale updating;

Взято из ответа на Nginx как отключить многопоточную загрузку:

Используйте nginx пример для limit_conn конфигурация:

limit_zone one $binary_remote_addr 10m;

server {
  location /download/ {
    limit_conn one 1;
  }
}

Это не просто менеджеры загрузки с Range запрашивает мультиплексную загрузку (и это не отключает Range заголовки); современные браузеры, загружающие страницы, также мультиплексируют запросы. Будьте очень осторожны при использовании этой конфигурации везде, где ожидается location что вам нужно специально предотвратить мультиплексные загрузки для.