探讨一下想使用cdn又不想浪费钱的方案?

2012-09-26 00:54:50 +08:00
 sdjl
是这样的, 我最近打算给冷笑话网站写一个cdn的程序, 冷笑话在推广的时候会在一两个小时内有大量的pv, 然后我们的带宽就不够用了, 所有我们买了upyun的服务。

但是upyun并不是真正的cdn, 他不能根据图片地址自动来我们网站抓取文件, 而必须要我用api去上传到他们的服务器。

然后我们毕竟是有60M的独享带宽的, 如果平时也开启cdn的话那这个带宽费就白交了, 因此我希望能够根据网卡最近5秒的带宽流量来自动开启和关闭cdn, 一来可以保证访问速度, 二来充分利用现有带宽。

我是打算通过修改文件的访问host来开启或关闭使用cdn, 比如 /img/** 是不适用cdn的情况, 而 http:// img.lengxiaohua.com/*** 是使用cdn的情况。

然后问题来了, 起初我是想直接修改nginx配置, 使用跳转到upyun的办法, 那么存在下面三个问题:
1 nginx转发次数太多, 我们高峰时10分钟就有1w多个pv,每个pv又会有几十个文件请求,而我们的服务器仅是42区的一个8G内存的VPS。 因此这种跳转的量应该还是比较大的吧?
2 我不知道怎么在nginx中判断最近5秒钟的网卡流量, 算能够自动开启cdn, 那么还需要做一个缓存的处理。 对nginx编程不熟悉, 所以感觉这个方案比较困难。
3 我之前提到,upyun需要先上传后访问, 而nginx在判断是否开启cdn时并不知道文件是否已经上传到upyun。

因此我觉得只能在python程序中来判断是否开启cdn, 若开启, 就把对应的js css img文件地址改为upyun的host。 然后又有以下一些问题需要解决:
1 需要先判断文件是否已经上传到upyun, 如果成功上传则修改host, 否则先上传文件, 这一步倒是好说。
2 各种文件太多, 有固定存在的js css img, 也有用户上传的img。 有html内嵌的文件, 也有js css中动态调用的文件。 要分别针对不同的文件修改host。(使用正则)
3 cdn开启时, 也要修改api中的文件host,因为api返回的结果不是html的, 可能是json的, 也可能是纯文本的, 工作量增大。
4 为了达到能够让用户快速打开页面, 要针对静态文件(写程序时加到代码库里面的,比如css,logo等)和 动态文件(用户上传的)分别有不同的管理策略, 比如可能需要一直开启静态文件的cdn, 而动态文件根据浏览判断是否使用cdn。


可能是我没有想到更好的办法, 因此在这两种方案中想来想去也不知道怎么做更好, 前者理解起来比较简单, 但是问题2 3不知怎么解决。 后者虽然基本能解决需求, 但是解决方案过于复杂。


然后, 我还在想,upyun这个是不是可以自动调换成免费的新浪图床? 优先使用新浪图床且可以一键切换到upyun?

各位有经验的朋友是怎么解决这类问题的? 请给点思路, 谢了

顺便打个广告,我们是sparker5互联网圈内外包团队, http://lengxiaohua.com 是我们接的一个活, 经过不断的优化得到一个经验,只要有一个42区2G内存的vps, 像冷兔这种网站日100w pv的压力不成问题, 关键是带宽。。。 各位同学买vps还是朝着便宜的考虑吧。。。

附带42区vps广告连接 :)
http://vps.42qu.com/by/10021174


对了, 有想买upyun的朋友注意了, upyun不能自动抓取文件, 必须你自己上传, 因此他不算是cdn吧, 之前买的时候我没考虑到这点, 不过upyun比较便宜。
8824 次点击
所在节点    CDN
35 条回复
qq286735628
2012-09-26 01:40:37 +08:00
我觉得你是被自己的60M带宽给困住了。
你是想流量超过你们瓶颈的时候,才切换使用CDN的流量。
CDN并不仅仅是分担流量,还有一个就近分发的作用。

建议
1、不要纠结你那60M,虽然花了很多钱,启用CDN,用户能有一个更低的延迟。
2、至于upyun不能自动抓的问题,那你就主动push呗,写个监控脚本主动push到upyun的FTP上不是什么难事
daweiba
2012-09-26 03:04:45 +08:00
根据5秒钟网卡流量修改nginx配置?
就是说流量高的时候每5秒nginx reload 一次配置文件?
有冇搞错?
daweiba
2012-09-26 03:15:20 +08:00
你都说了 upyun不是cdn
怎么还cdn cdn的啊 看的头疼


用python修改url就行了呗
每5秒钟检测网卡流量
超标则 域名变量改为upyun
否则用本机
feiandxs
2012-09-26 04:15:39 +08:00
1 10分钟1w pv不算啥,甭怕。当然,我这随口一说,没考虑动态处理部分。只说nginx。
2 nginx干不了检测网卡流量的事,用一个shell脚本cron几秒钟跑一次就可以了。

但是,这不是蛋疼么。。。。

楼主现在的问题不就是怕浪费了那带宽么。要不然你这样,利用dns把图片流量切分开来,一部分直接走upyun,一部分走你本机,反代到upyun出来的地址,也可以利用dns做到大致上控制流量比例,让你这个60M带宽不浪费。

这样也蛋疼,但没那个测网卡流量做切换疼的厉害。。。

楼主现在的问题,其实是一个典型的架构选型的时候考虑不周全的问题,现在在为这个考虑不周全买单了,如果你当时入手一个CDN,哪怕只是短时间过渡,也可以根据具体带宽占用情况,收集数据,最后决定怎么做。。。比现在这样好。
当然,不是吐槽楼主,60M带宽也不便宜,对小网站来说也很辛苦,一分钱也是钱啊。上面我那个反代又拍云的方法并不是玩笑,你可以认真的考虑下。在实际环境中,我就曾经帮人做过这样的事,有一定的效果的。当然如果并没有资金紧张到这种程度,那么还是直接使用又拍云吧。你多出来的带宽不用急,安心考虑更应该考虑的问题,很快业务会能够跑到用上这60M的。有点信心嘛。
我最近也有一个比较大的网站,在阿里云有50M左右带宽使用,价格太贵,也很快会转到又拍云去了。

还有,就算刷网卡流量改配置,也别上python,这时候就该shell这种大杀器上马。

同时赶着楼主的帖子也发个广告。
http://www.fullpanel.net XD
BOYPT
2012-09-26 09:48:19 +08:00
为了60M带宽去写一套系统,佩服佩服
BOYPT
2012-09-26 09:55:02 +08:00
CDN = Content Distribute Network,主动上传然后给你调用怎么就不算CDN了。

主流CDN基本都分主动推送与被动抓取,前者适合更大规模的流量分发,被动抓取的依然会给源站带来压力。
c0878
2012-09-26 10:05:29 +08:00
带宽难道是年付的??可以减下来嘛 就像上面说的CDN不仅仅是带宽分流 还有个就近分发
42区的VPS应该是双线吧 双线的带宽是比CDN贵的
mingxing
2012-09-26 10:17:49 +08:00
@sdjl 目前又拍云的静态CDN正在最后的测试中,预计将会于国庆之后正式上线,到时候应该可以满足您的CDN的需求。欢迎到时候来测试使用~
Livid
2012-09-26 11:42:59 +08:00
你需要的是一个能够按照流量计费的面向小网站的 CDN,在美国有很多选择,及 Amazon 的 CloudFront,而目前国内确实还没有这样的产品。
sdjl
2012-09-26 13:22:16 +08:00
@qq286735628 嗯 是的, 如果一直用cdn的话速度确实是比较快的, 所以我想把静态文件一直开启。 你说的不要纠结现有带宽这个说法不太赞同, 我初步算了一笔账, 如果按照现在的流量来算, 如果全部文件常开upyun, 那么一年的upyun费用在2w以上, 如果以后流量增加的话就更贵了。

@daweiba 是对nginx编程, 不是reload

@BOYPT 写这个程序估计一周, 第一年可以节约2w块以上, 我觉得有必要写~~~

@c0878 年付,7线,机房60M是一年9w, 是比upyun贵

@mingxing 好的, 关注
sdjl
2012-09-26 13:24:14 +08:00
@c0878 关键在于这60M已经买下来了~~~ 明年的方案可以明年再考虑
sdjl
2012-09-26 13:30:38 +08:00
补充一下,打开网站的速度主要是静态js css img图片决定的, 而这个网站打开后90%的流量都是后期load图片时产生的, 而图片会在页面load完成后提前加载, 因此只要能做好静态文件的cdn, 就能提高页面的加载速度, 后面的图片流量走我们的服务器应该不会造成体验上的延迟。
somin
2012-09-26 15:07:24 +08:00
网站速度是由http请求页面而决定的,http请求又是有多种因素影响,如css js html image 等。
cdn主要加速静态页面。比如css js image。注意:cdn最好不要直接对主站加速。这样以免影响搜索爬虫对网站的抓取,类似你的站90%流量都被image拿走,那太不值得了。CDN免费基本上都是限量的。又不花钱的我倒没找到没发现~~你可以尝试一下这样,如果流量大的话,静态页面用一个台服务器。image可以用多台服务器进行加速。
littlesuper
2012-09-27 12:11:01 +08:00
去二线城市,例如湖南那些,1年100M独享才2W带宽费~~我用了一年,稳定性还是不错~~只是一些分享解析之类的就别寄望那些廉价机房来做了,很坑爹。。。
sdjl
2012-09-27 13:54:41 +08:00
@littlesuper 百兆独享一年2w, 有这么便宜?
rhwood
2012-09-27 16:20:51 +08:00
lz的问题很蛋疼
正统思路是varnish(缓存+判断后端)+Haproxy(反向代理+宕机检测)
什么检测带宽后决定是否启用cdn?一般做法是用宕机检测,一台不行就备用一台
对于瞬间爆发流量,varnish是最佳选择,原因如下:
1 第一次访问过后的短时间请求全部通过varnish缓存响应,不对后端产生压力
2 支持saint mode,可以检测后端返回502时,在多少时间内不访问后端,而让varnish直接返回过期缓存,这个比你检测带宽什么的可靠多了
3 支持针对http host/url 自定义多个后端
4 修改hosts这种方式定义后端,不如varnish+haproxy简洁利落
不打广告。
enj0y
2012-09-27 17:08:43 +08:00
建议楼主考虑阿里云oss.
zxy
2012-09-27 17:40:03 +08:00
我在思考学校200M带宽 252核心512G内存的服务器组放一个校园网站有多浪费
Showfom
2012-09-27 19:48:27 +08:00
楼主我们可以提供 ChinaCache 的 CDN,联系我购买有优惠哦 按带宽算的= = sales@xehost.com
Showfom
2012-09-27 19:50:02 +08:00
萝卜网的解决方案是使用一台国外的100TB流量的服务器(差不多平均300多M带宽的样子),装上TCP加速优化软件,然后使用 ChinaCache 的 CDN,按照带宽来买,就比较划算了。

如果不用上 CDN 也足够支撑大的访问量,大家可以测试一下我们加速过的国外服务器的下载速度:

http://x.com.sb/files/2011/1222/all.zip

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

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

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

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

© 2021 V2EX