探讨一下想使用cdn又不想浪费钱的方案? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果你希望学习 CDN 相关知识,那么建议你可以遍历以下软件的说明文档。
NGINX
cURL
sdjl
V2EX    CDN

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

  •  
  •   sdjl 2012-09-26 00:54:50 +08:00 9254 次点击
    这是一个创建于 4769 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的, 我最近打算给冷笑话网站写一个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比较便宜。
    35 条回复    1970-01-01 08:00:00 +08:00
    qq286735628
        1
    qq286735628  
       2012-09-26 01:40:37 +08:00
    我觉得你是被自己的60M带宽给困住了。
    你是想流量超过你们瓶颈的时候,才切换使用CDN的流量。
    CDN并不仅仅是分担流量,还有一个就近分发的作用。

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


    用python修改url就行了呗
    每5秒钟检测网卡流量
    超标则 域名变量改为upyun
    否则用本机
    feiandxs
        4
    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
        5
    BOYPT  
       2012-09-26 09:48:19 +08:00
    为了60M带宽去写一套系统,佩服佩服
    BOYPT
        6
    BOYPT  
       2012-09-26 09:55:02 +08:00
    CDN = Content Distribute Network,主动上传然后给你调用怎么就不算CDN了。

    主流CDN基本都分主动推送与被动抓取,前者适合更大规模的流量分发,被动抓取的依然会给源站带来压力。
    c0878
        7
    c0878  
       2012-09-26 10:05:29 +08:00
    带宽难道是年付的??可以减下来嘛 就像上面说的CDN不仅仅是带宽分流 还有个就近分发
    42区的VPS应该是双线吧 双线的带宽是比CDN贵的
    mingxing
        8
    mingxing  
       2012-09-26 10:17:49 +08:00
    @sdjl 目前又拍云的静态CDN正在最后的测试中,预计将会于国庆之后正式上线,到时候应该可以满足您的CDN的需求。欢迎到时候来测试使用~
    Livid
        9
    Livid  
    MOD
    PRO
       2012-09-26 11:42:59 +08:00
    你需要的是一个能够按照流量计费的面向小网站的 CDN,在美国有很多选择,及 Amazon 的 CloudFront,而目前国内确实还没有这样的产品。
    sdjl
        10
    sdjl  
    OP
       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
        11
    sdjl  
    OP
       2012-09-26 13:24:14 +08:00
    @c0878 关键在于这60M已经买下来了~~~ 明年的方案可以明年再考虑
    sdjl
        12
    sdjl  
    OP
       2012-09-26 13:30:38 +08:00
    补充一下,打开网站的速度主要是静态js css img图片决定的, 而这个网站打开后90%的流量都是后期load图片时产生的, 而图片会在页面load完成后提前加载, 因此只要能做好静态文件的cdn, 就能提高页面的加载速度, 后面的图片流量走我们的服务器应该不会造成体验上的延迟。
    somin
        13
    somin  
       2012-09-26 15:07:24 +08:00   1
    网站速度是由http请求页面而决定的,http请求又是有多种因素影响,如css js html image 等。
    cdn主要加速静态页面。比如css js image。注意:cdn最好不要直接对主站加速。这样以免影响搜索爬虫对网站的抓取,类似你的站90%流量都被image拿走,那太不值得了。CDN免费基本上都是限量的。又不花钱的我倒没找到没发现~~你可以尝试一下这样,如果流量大的话,静态页面用一个台服务器。image可以用多台服务器进行加速。
    littlesuper
        14
    littlesuper  
       2012-09-27 12:11:01 +08:00
    去二线城市,例如湖南那些,1年100M独享才2W带宽费~~我用了一年,稳定性还是不错~~只是一些分享解析之类的就别寄望那些廉价机房来做了,很坑爹。。。
    sdjl
        15
    sdjl  
    OP
       2012-09-27 13:54:41 +08:00
    @littlesuper 百兆独享一年2w, 有这么便宜?
    rhwood
        16
    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
        17
    enj0y  
       2012-09-27 17:08:43 +08:00
    建议楼主考虑阿里云oss.
    zxy
        18
    zxy  
       2012-09-27 17:40:03 +08:00
    我在思考学校200M带宽 252核心512G内存的服务器组放一个校园网站有多浪费
    Showfom
        19
    Showfom  
    PRO
       2012-09-27 19:48:27 +08:00
    楼主我们可以提供 ChinaCache 的 CDN,联系我购买有优惠哦 按带宽算的= = [email protected]
    Showfom
        20
    Showfom  
    PRO
       2012-09-27 19:50:02 +08:00
    萝卜网的解决方案是使用一台国外的100TB流量的服务器(差不多平均300多M带宽的样子),装上TCP加速优化软件,然后使用 ChinaCache 的 CDN,按照带宽来买,就比较划算了。

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

    http://x.com.sb/files/2011/1222/all.zip
    lamengao
        21
    lamengao  
       2012-09-27 20:42:27 +08:00
    CDN 可以试试 http://www.webluker.com 按流量收费。
    然后配合 dnspod 的 api 使用,这样的搭配方案不用更改文件的url。
    huobazi
        22
    huobazi  
       2012-09-27 23:19:29 +08:00
    @mingxing 拭目以待啊
    lfeng
        23
    lfeng  
       2012-09-27 23:34:28 +08:00
    又拍云的CDN空间已经在内部测试了,预计国庆后上线
    sdjl
        24
    sdjl  
    OP
       2012-09-28 11:31:25 +08:00
    @lamengao 这个比upyun贵多了, 我们当时买的是5000元11000G, 这个估计11000G要1w块了

    @lfeng
    @mingxing 你们早点上线我就不用这么纠结了~~~ 上线之后是不是可以自动抓取我的文件? 不需要我主动上传?
    mingxing
        25
    mingxing  
       2012-09-28 11:35:19 +08:00
    @sdjl 哈哈,当时还在开发过程嘛~上线之后,如果选择使用静态CDN功能,会自动抓取你的文件,不需要上传啦~
    sdjl
        26
    sdjl  
    OP
       2012-09-28 14:58:40 +08:00
    @mingxing 收费是一样的吗?
    mingxing
        27
    mingxing  
       2012-09-28 17:08:38 +08:00
    @sdjl 收费模式还是按照实际使用的流量收费的~
    fatlei
        28
    fatlei  
       2012-10-01 05:38:46 +08:00
    告诉楼主一个比较蛋疼的办法,自己在电脑旁边看,看流量差不多了,手动切换到又拍云.
    bombless
        29
    bombless  
       2012-10-01 09:16:37 +08:00
    不是有cloudflare么。根据朋友那个5万PV的网站的小站的反响,它的免费服务就已经不错了。
    ipconfiger
        30
    ipconfiger  
       2012-10-01 11:49:54 +08:00
    话说.....找个按流量算的CDN不就ok了。
    或者干脆不想花钱的话,可以试试我这个小玩意儿 https://github.com/ipconfiger/pyImageServer
    conis
        31
    conis  
       2012-10-01 19:59:26 +08:00
    1.先要搞清楚你网站流量是被谁占用了,你的网站大致可以分为三部分,网页/静态文件/UGC。
    2.通常来说,80%的流量是被20%的内容耗费的。

    我觉得还是重点来处理静态文件吧,因为静态文件一般改动不大,所占流量也比较多,资源类网站除外。
    1.将静态文件分发到云上,当然有不花钱的方案是分发到各免费云上,反正不花钱,申请多几个。
    2.网页生成静态页面,一般来说,高峰是可以预期的。如果不可以预期,可以用程序检测。当发生高访问量的时候,修改js和css的指向
    3.如果访问量比较大,可以根据不同的ip段或者时间分发不同的静态文件,也可以由客户端JS自动选择。例如:你有10个静态服务器,你就把重点网页生成10份html,然后读取到内存,根据不同条件分发不同的html
    4.对于UGC,可以把访问量高的也做到静态服务器。

    最后,你还也借助DNSPod的API,将不同地区的请求解析到不同的服务器。我的原则,是花最少钱办最多事,不花钱最好,当然,这会麻烦一些。
    优点:你可以控制什么时候用静态服务器,当访问量下去后,重新生成静态页。比如说你用到阿里云,按需付费,这样节省成本。如果你不是特别在意速度的话,完全可以用免费云,这样可以节省很多成本。
    缺点:技术有一定要求,如果你静态文件特别多的话,重新生成会占一定资源,但我觉得常访问的内容没这么多吧。
    conis
        32
    conis  
       2012-10-01 20:05:31 +08:00
    唉,看了一下楼主提供的网站,你这个网站优化还真不行啊,先把优化做好,再来说什么CDN吧。提你几个建议:
    1.JS和CSS没有去注释和压缩
    2.JS太多,完全不合理,至不超过4个,CSS合并到1个
    3.图片我没太看,也应该有合并的空间

    先把这几个做了,你的带宽占用和速度都会有改善
    bigdude
        33
    bigdude  
       2012-10-18 20:47:10 +08:00
    我咋觉着图床带宽的钱可以省出来的,有免费的可外链的超大流量图床的阿
    sdjl
        34
    sdjl  
    OP
       2012-10-18 22:18:38 +08:00
    @conis 嗯 谢谢, 这几天这在处理, 因为事情太多忙不过来。。。

    @bigdude 新浪?
    hornet
        35
    hornet  
       2012-11-10 00:58:10 +08:00
    网站设计的时候定义几个域名变量,比如UGC_M_SERVER, IMG_SERVER, JS_SERVER, CSS_SERVER... 分别对应不同的资源类型
    域名设置里面比如S1.abc.com, S2.abc.com S1可能是CDN,S2则是你自己的机器。

    可以根据来访IP,来动态映射域名变量到S1或S2
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     896 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 597ms UTC 20:04 PVG 04:04 LAX 13:04 JFK 16:04
    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