防止突发性流量冲击

2012-10-23 14:50:54 +08:00
 bearice
嗯最近公司的服务器被人当图床使了。因为我们的服务器没有CDN也不能做Referer验证(因为还还有第三方客户端请求),所以如果有人吧链接贴到人人、煎蛋之类的流量十分巨大的网站的时候就会给服务器带来一个很大的流量冲击,造成其他用户无法使用。

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

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

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

不知道各位还有什么其他的更好的方法么?
5631 次点击
所在节点    NGINX
16 条回复
Showfom
2012-10-23 15:18:19 +08:00
不要过滤空的refer

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

就ok了
Showfom
2012-10-23 15:19:34 +08:00
第三方referer请求直接redirect到google.com去。。。
bearice
2012-10-23 15:35:47 +08:00
@Showfom 要是可以直接过滤就没有这么麻烦了。问题是 由于第三方客户端的存在,“合法” 的请求可能来自任何地方。
HowardMei
2012-10-23 17:54:56 +08:00
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
2012-10-23 17:58:18 +08:00
把referer是人人和煎蛋的拒绝不就可以了么
bearice
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
2012-10-23 22:37:52 +08:00
@bearice ”拿不准就穷举“嘛哈哈
huihen
2012-10-24 22:54:24 +08:00
放到又拍云上可以么?
HowardMei
2012-10-24 23:40:21 +08:00
@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
2012-10-25 04:40:35 +08:00
过滤的请求,别返回空值啊,也别“redirect到google.com去”
而是返回你们的LOGO,或者其他小图片广告。会有额外的收获。
txlty
2012-10-25 04:49:31 +08:00
[由于第三方客户端的存在,“合法” 的请求可能来自任何地方。]
怎么第三方客户端还带refer的?

除了空refer,和“合法refer”,都进行限制。某个refer,从第一次请求,到1分钟内,都返回正常图片。
1分钟后,返回LOGO,或者广告图片(耗带宽较小的)。
qiaoy
2012-10-25 13:17:23 +08:00
国内还是有靠谱的免费CDN可用的。
BOYPT
2012-10-26 13:44:03 +08:00
这个自动化也用不着多复杂吧,写个脚本统计access log的refer的hostname,前多少名的按nginx的格式输出到一个文件,然后nginx的配置里面include这个文件,然后reload信号一次;
freewizard
2012-10-26 14:25:23 +08:00
@qiaoy 比如?
bearice
2012-10-26 17:01:09 +08:00
@BOYPT good idea!
BOYPT
2012-10-26 17:45:51 +08:00
@bearice 其实可以用fail2ban来做的,fail2ban不仅仅是能够封IP,我记得是一个抽象了触发和动作的一个框架,可以自定义,python写的,所以看看文档应该不难实现这个方案;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/50689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX