OpenResty 限制下载速度

翻译 2017年09月01日 09:42:45

http://blog.donatas.net/blog/2017/07/25/limit-bandwidth-openresty/

Nginx 有两个非常棒的模块用来限制响应(responses)的速度

一般情况没问题,但是视频流传输就不好用了

location / {
    limit_rate_after 500k;
    limit_rate 50k;
    ...
}

上面的配置意味着,你可以缓冲500k然后开始限速(me:有点类似视频开头不限速,后面才开始限速), 如果你使用 browser/player/whatever 来播放,就会发现每次缓冲都会使用新建一个请求,相当于限速的作用被削弱了。

如果我想把这些限制只用于视频流,而不是简单的wget这种模式呢(视频流是chunk的)? 我的意思是 - 以反向指数方式,相同URI限制下一个请求,如反向TCP拥塞行为。(me:同一个客户端的并发请求能全局限速, 可以感知并发)

尽可能使用简单的方式实现,但不是越简单越好

为每个 uri 创建SHA256 的hash,并且设置5分钟的有效期,这期间对每个请求进行计数。计数器是用来指数级的加大限速

26214400
  6553600
  1638400
  409600
  102400
  25600
  6400
  ...

router.conf:

location / {
        set $limit_rate '';
        set $limit_rate_after '';
        access_by_lua_file conf/router.lua;
        proxy_buffering on;
        ...
    }

router.lua:

ocal request_count = function ()
  local resty_sha256 = require "resty.sha256"
  local str = require "resty.string"
  local sha256 = resty_sha256:new()
  sha256:update(ngx.var.http_host .. ngx.var.request)
  local digest = sha256:final()
  local key = "request:" .. str.to_hex(digest)

  local ok, err = redis:connect("127.0.0.1")
  if not ok then
    return nil, err
  end

  local ok, err = redis:auth("something")
  if not ok then
    return nil, err
  end

  local data, _ = redis:get(key)
  redis:incr(key)
  redis:expire(key, 300)

  return data
end

local bw_limit = 104857600
if request_count() ~= ngx.null then
  bw_limit = math.max(10240, math.floor(bw_limit / 2 ^ request_count()))
end

ngx.var.limit_rate = bw_limit
ngx.var.limit_rate_after = 8388608

这样在一段时间里,就无法通过并发方式来突破限速了。

相关文章推荐

【Nginx】下载,请求限流限速,根据URL参数限速

这个场景是限制单个连接的下载速度,还有限制单个IP的连接数,或者单位时间内的请求数,实验环境 nginx1.9.x。 小例子为主,具体的细节请多看文档。 限制下载速度location /downloa...

Java服务端限制下载速度

云存储openstack swift组件下载限速

使用trickle限制网络上传和下载速度

使用trickle限制网络上传和下载速度 yum install trickleTrickle如何工作? Trickle通过控制socket数据读写量来控制和限制应用的上传/下载速度。它使用另一个版本...

Nginx下限速限制下载速度实例

转载:http://www.cuplayer.com/player/PlayerCode/Nginx/2014/0917/1571.html Nginx(著名的高性能http服务器和反向代理服务...
  • aly1989
  • aly1989
  • 2015年08月20日 16:36
  • 969

Apache服务器限制并发连接和下载速度

Apache服务器限制并发连接和下载速度  目前各种多线程下载工具泛滥,这对提供部分下载功能的网站来说是个比较头疼的问题,由于多线程下载会给服务器带来巨大的负载压力,而且可能会对整个站点产生影响,...
  • csjds
  • csjds
  • 2016年04月05日 22:36
  • 1969

Nginx并发数、每秒连接数、下载速度限制,防攻击杀手锏

1.限制IP访问频率: HttpLimitZoneModule 限制并发连接数实例 limit_zone只能定义在http作用域,limit_conn可以定义在http server locatio...
  • slovyz
  • slovyz
  • 2017年01月17日 15:56
  • 1084

php实现限制文件下载速度的代码实例

有时候你会出于某种目的而要求把下载文件的速度放慢一些,例如你想实现文件下载进度条功能。限制下载速度最大的好处是节省带宽,避免瞬时流量过大而造成网络堵塞。// 将发送到客户端的本地文件 $local_f...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenResty 限制下载速度
举报原因:
原因补充:

(最多只允许输入30个字)