V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
bearice
V2EX  ›  NGINX

防止突发性流量冲击

  •  
  •   bearice ·
    bearice · 2012-10-23 14:50:54 +08:00 · 5820 次点击
    这是一个创建于 4396 天前的主题,其中的信息可能已经有所发展或是发生改变。
    嗯最近公司的服务器被人当图床使了。因为我们的服务器没有CDN也不能做Referer验证(因为还还有第三方客户端请求),所以如果有人吧链接贴到人人、煎蛋之类的流量十分巨大的网站的时候就会给服务器带来一个很大的流量冲击,造成其他用户无法使用。

    恩至于为什么不用CDN:“我估计产生费用的方案是不会通过的” 这是原话(ry

    于是需要一个解决方案:根据 referer 的访问频率做动态过滤,如果一定时间段内某个域名的流量超过阀值则屏蔽一段时间。

    原本打算请出nginx_lua_module做限制的,不过后来发现了 https://github.com/perusio/nginx-auth-request-module 这个东西,可以在不修改后端构架的情况下对请求进行动态过滤。

    不知道各位还有什么其他的更好的方法么?
    16 条回复    1970-01-01 08:00:00 +08:00
    Showfom
        1
    Showfom  
       2012-10-23 15:18:19 +08:00
    不要过滤空的refer

    过滤所有的refer,除了你公司的网址

    就ok了
    Showfom
        2
    Showfom  
       2012-10-23 15:19:34 +08:00
    第三方referer请求直接redirect到google.com去。。。
    bearice
        3
    bearice  
    OP
       2012-10-23 15:35:47 +08:00
    @Showfom 要是可以直接过滤就没有这么麻烦了。问题是 由于第三方客户端的存在,“合法” 的请求可能来自任何地方。
    HowardMei
        4
    HowardMei  
       2012-10-23 17:54:56 +08:00   ❤️ 1
    1. 用auth-request不懂怎样实现动态过滤,这么麻烦还不如直接在url后面放个token,让合作方也加token; 不懂Lua,看起来很高级的样子,效果肯定呱呱叫。

    2. 不怕误杀,就用fail2ban,filter regex匹配nginx access日志的referrer
    结合maxretry和findtime,超过threshold_rate=maxretry/findtime后在bantime内拒绝客户端ip访问80端口,动态过滤效果应该是很好的,就是会误杀一些共用一个ip/proxy的局域网客户(俺就是!)

    3. 可以上varnish,有vmod提供可定制的throttle功能,看起来也不错
    reus
        5
    reus  
       2012-10-23 17:58:18 +08:00
    把referer是人人和煎蛋的拒绝不就可以了么
    bearice
        6
    bearice  
    OP
       2012-10-23 22:25:48 +08:00
    @HowardMei
    1.1)情况累类似新浪微博,修改代码肯定不现实
    1.2)吧 /auth proxy 到一个脚本上就OK 了
    1.3) nginx的lua扩展我之前也只是听说过,但是想想如果还要做memcached的话似乎还挺麻烦。

    2) fail2ban误伤范围有点儿太大了...

    3) varnish 现在也在用,不过纯粹作为内存缓存。 没有研究过高级功能不过感谢提供思路w

    @reus 主要是为了一劳永逸的解决问题,不然今天ban了 人人,明天来个入人,后来来个生人。还不要被搞死(
    reus
        7
    reus  
       2012-10-23 22:37:52 +08:00
    @bearice ”拿不准就穷举“嘛哈哈
    huihen
        8
    huihen  
       2012-10-24 22:54:24 +08:00
    放到又拍云上可以么?
    HowardMei
        9
    HowardMei  
       2012-10-24 23:40:21 +08:00   ❤️ 2
    @huihen 不光是峰值带宽限制吧,这种情况又拍云费用没法控制,cdn也一样,曾经有个老外把几万张照片放S3里,然后用google spreadsheet作图片索引列表,没想到google默认5分钟fetch一次还不缓存,S3也不限制Gbps级传输,结果很快他就收到一个巨额账单(几十TB),还好amazon退钱了,google也很快做了修正,最终损失不大,但流量之贵可见一斑,无效流量对网站运营杀伤力很大。

    S3流量费$170/TB,linode $100/TB算便宜的,不知又拍云什么价格。现在网页越来越重,假设都带图,平均体积超1MB是必然的, 每月不到100万次请求就有1TB流量,也就日均3万次,大概每天5000~10000访客的水平,要是网站还没盈利,会有压力的。
    txlty
        10
    txlty  
       2012-10-25 04:40:35 +08:00
    过滤的请求,别返回空值啊,也别“redirect到google.com去”
    而是返回你们的LOGO,或者其他小图片广告。会有额外的收获。
    txlty
        11
    txlty  
       2012-10-25 04:49:31 +08:00
    [由于第三方客户端的存在,“合法” 的请求可能来自任何地方。]
    怎么第三方客户端还带refer的?

    除了空refer,和“合法refer”,都进行限制。某个refer,从第一次请求,到1分钟内,都返回正常图片。
    1分钟后,返回LOGO,或者广告图片(耗带宽较小的)。
    qiaoy
        12
    qiaoy  
       2012-10-25 13:17:23 +08:00
    国内还是有靠谱的免费CDN可用的。
    BOYPT
        13
    BOYPT  
       2012-10-26 13:44:03 +08:00
    这个自动化也用不着多复杂吧,写个脚本统计access log的refer的hostname,前多少名的按nginx的格式输出到一个文件,然后nginx的配置里面include这个文件,然后reload信号一次;
    freewizard
        14
    freewizard  
       2012-10-26 14:25:23 +08:00
    @qiaoy 比如?
    bearice
        15
    bearice  
    OP
       2012-10-26 17:01:09 +08:00
    @BOYPT good idea!
    BOYPT
        16
    BOYPT  
       2012-10-26 17:45:51 +08:00
    @bearice 其实可以用fail2ban来做的,fail2ban不仅仅是能够封IP,我记得是一个抽象了触发和动作的一个框架,可以自定义,python写的,所以看看文档应该不难实现这个方案;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2670 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:29 · PVG 23:29 · LAX 07:29 · JFK 10:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.