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

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

  •  
  •   sdjl · 2012-09-26 00:54:50 +08:00 · 8770 次点击
    这是一个创建于 4428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的, 我最近打算给冷笑话网站写一个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
       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  
       2012-09-27 19:48:27 +08:00
    楼主我们可以提供 ChinaCache 的 CDN,联系我购买有优惠哦 按带宽算的= = [email protected]
    Showfom
        20
    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
    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   ·   实用小工具   ·   2670 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.