防止突发性流量冲击 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bearice
V2EX    NGINX

防止突发性流量冲击

  •  
  •   bearice
    bearice 2012-10-23 14:50:54 +08:00 6401 次点击
    这是一个创建于 4803 天前的主题,其中的信息可能已经有所发展或是发生改变。
    嗯最近公司的服务器被人当图床使了。因为我们的服务器没有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  
    PRO
       2012-10-23 15:18:19 +08:00
    不要过滤空的refer

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

    就ok了
    Showfom
        2
    Showfom  
    PRO
       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     Solana     4050 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 10:13 PVG 18:13 LAX 02:13 JFK 05:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86