我们使用nginx作为反向代理从上游服务器获取文件。 这些文件不是dynamic的 – 至less不是基于每个请求的 – 并且(有时)在高延迟之后。
我想限制同一个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回应。
从Nginx中回答如何禁用multithreading下载 :
对于limit_connconfiguration使用nginx 示例 :
limit_zone one $binary_remote_addr 10m; server { location /download/ { limit_conn one 1; } }
这不仅仅是下载pipe理器的Range请求多路复用下载(这不会禁用Range标题); 现代浏览器也加载页面多路复用请求。 在任何地方使用此configuration时要非常小心,因为这需要一个location ,您需要专门防止多路复用下载。
一个可能的解决scheme是caching。 当使用代理pass或fggi pass与nginx时,您可以selectcaching返回数据一段时间。 您可以在文档中阅读更多关于它的信息: proxy pass和fcgi version 。 这两者在工作方式上几乎完全相同。
我也build议找一些关于它的教程,因为这些caching操作员的部分工作如何在文档中并不完全无关紧要。
但主要的想法是,你从你的URL(你的情况)做一个代理“钥匙”。 然后你可以设置它caching10分钟或其他东西。 所以后续的调用是从本地caching中提供的,而不是再次获取它。
然后您可以通过设置来防止更新期间的后续请求:
proxy_cache_use_stale updating;