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