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

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

系统限流实践 - 接入层限流(下*完结)

本文是根据开涛的博客 聊聊高并发系统之限流特技-2 整理而成,自学笔记第二篇 目录1.系统限流实践 - 理论篇 2.系统限流实践 - 应用限流 3.系统限流实践 - 分布式限流 4.系统限流实践...
  • lzw_2006
  • lzw_2006
  • 2016年07月14日 15:09
  • 4625

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

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

OpenResty(nginx扩展)实现防cc攻击

OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工...
  • linuxnews
  • linuxnews
  • 2016年07月08日 19:53
  • 1255

Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis

Lua模块开发在实际的开发过程中,不可能把所有的lua代码写在一个lua文件中,通常的做法将特定功能的放在一个lua文件中,即用lua模块开发。在lualib目录下,默认有以下的lua模块。luali...
  • forezp
  • forezp
  • 2017年11月23日 16:58
  • 5737

OpenResty 限制下载速度

http://blog.donatas.net/blog/2017/07/25/limit-bandwidth-openresty/ Nginx 有两个非常棒的模块用来限制响应(responses)的...
  • lzz957748332
  • lzz957748332
  • 2017年09月01日 09:42
  • 463

openresty 限流 (redis+lua) 备忘

githunb上下载lua-resty-limit-traffic  解压到/usr/openv/servers/lualib/restylimit目录下。 servers 为openresty安装...
  • dayandou528
  • dayandou528
  • 2016年09月24日 16:20
  • 338

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

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

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

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

nginx lua 限制流量脚步

[+] 防刷的概念: 防刷的目的是为了防止有些IP来爬去我们的网页,获取我们的价格等信息。不像普通的搜索引擎,这种爬去行为我们经过统计最高每秒300次访问,平均每秒266次访问...
  • pzqingchong
  • pzqingchong
  • 2017年02月08日 15:05
  • 976

Centos 7 安装 OpenResty api 网关 Orange

1,Orange网关Orange是一个基于OpenResty的API网关。除Nginx的基本功能外,它还可用于API监控、访问控制(鉴权、WAF)、流量筛选、访问限速、AB测试、动态分流等。它有以下特...
  • freewebsys
  • freewebsys
  • 2017年03月09日 21:31
  • 3720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenResty 限制下载速度
举报原因:
原因补充:

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