阿里云OSS内网免费流量外网用,搭配CDN镜像,黑技能

本文被很多网友阅读,有人问我相关问题,这里先澄清一下。这篇文章写的很早,16年,里面的方法现在可能已经没用了。即使该方法可用,仍然需要考虑宽带问题,因为虽然内网宽带免费,但是出网还是要靠你的服务器,如果服务器本身只有 1M 的宽带,那么小水管反而会阻塞你的网站,拖慢你的服务,甚至拒绝服务。所以,对于有点钱的同学,上 CDN,花不了多少钱。这篇文章仅做乐趣阅读,不要用于生产。另外可以继续阅读《阿里云OSS的回源镜像和图片功能妙用》,也是用于乐趣。

对于付不起钱的小伙计,为了给公司省钱,想尽一切招数。今天就来分享一个使用阿里云OSS存储搭配CDN使用的网站服务器部署方法。

简介

阿里云OSS

阿里云提供的一种文件存储方案,和我们以前接触的百度云BCS和新浪云的Storage是一个道理,即文件的云端存储方案。一般而言,OSS只存储网站所需要的静态文件,而不存储程序文件。例如将网站的图片、视频、脚本、样式等文件存储在OSS,同时,OSS实际上有点类似我们以前使用的第三方服务商提供的相册,OSS上的文件,阿里云会给一个url让你可以直接使用。在依托OSS在windows或mac上的客户端,管理OSS上的附件资源也很方便。总之,OSS是帮助网站存储文件的一项服务。

我们已经有自己的服务器了,为什么还要将文件传到OSS上,然后通过阿里云提供的url来使用附件呢?实际上我们现在的服务端开发工作中,一定要有云的概念,即我们在搭建服务器环境,设计服务端架构的时候,必须以云计算出发去设计和实施。这是我们这几年来服务端发展的结果。(当然,如果一个网站实在太小了,没多少人访问,也可以忽视。)将网站运行在ECS(云服务器)上,同时,把一些大块的文件(图片、视频)放在OSS,可以有效的降低访客访问(下载)这些文件时,对服务器带来的IO压力,让服务器运行起来更加流畅。这是我们使用OSS服务的最根本原因。除此之外,使用OSS还可以加快附件的传输速度,用户可以明显感觉图片、视频加载变快,结合CDN,可以在文件的访问路径上进一步优化。相对于通过加服务器的存储空间的话费,使用OSS还可以省钱。

CDN的作用

CDN这个词应该很多人都略知一二。我们就不解释其运作原理,直接说它都有什么好处。CDN通过网络途径,直接解决了网络访问不畅的问题。在使用CDN之前,你直接将域名解析到你的服务器,一个用户访问你的网站必须通过自家路由器,再到区域电信运营商,再到主干网,再通过网络路由、DNS找到你的服务器,再把需要的资源下载到浏览器进行展示。中间任何一个环节的网络不好,都会导致网站访问变慢,甚至访问失败。而使用CDN之后,你把域名解析到CDN提供的一个中间地址,再再CDN服务商处设置你的服务器真实IP。当用户访问你的网站的时候,CDN服务商把你的网站资源缓存在自己的服务器上,并把距离访客最近服务器上的缓存返回给访客,这样直接加快了网站的访问速度。在七牛提供的服务中,我们遇到过一个词,叫“镜像”,把你的网站镜像到七牛,实际上,这个过程就是CDN了,所以,这里的镜像等于CDN。

除了上述的主要功能外,CDN近年来还增加智能解析、SEO、防DDOS等服务。所以,现在的网站,不用CDN,都不好意思说自己的网站多牛逼。

通过内网获取OSS中的文件在外网中返回

在OSS的收费策略中,存储、外网访问、API调用这三项都要收费,其中外网访问的费用还挺高。CDN也要收费,OSS外网访问也要收费,总之阿里云是赚翻了。但是,在OSS的收费策略中注明了:内网访问免费。也就是说,如果我们的使用阿里云的ECS通过内网去请求OSS中的资源,是不收费的。所以,我们现在要解决的问题就是,通过内网去请求的资源,怎么在外网中返回给访客呢?

服务器和OSS Bucket必须在同一区域

这是一个前提条件,也就是要构建“内网”这个组合。如果你的网站服务器购买的是杭州的,在创建Bucket的时候,就要选择杭州,如果是深圳的服务器,创建时就要选择深圳的。

学会使用ningx的代理设置

nginx除了作为web服务器之外,另外一个重大功能就是作为代理服务器。这种轻便又多功能的特性,应该是nginx身上最大的闪光点了。那么怎么来实现这种代理呢?其实很简单。

打开你的nginx的配置文件,例如nginx.conf,如果你对这个配置文件已经有一定的了解,那么应该可以很容易区分http和server两个区块的区别。我们要做的,是在其中一个server中增加一些配置项。具体是哪一个server,就看你绑定域名的时候是怎么安排的。总之,核心的配置如下:

http {
  ## ....
  server {
    ## ....
    location ~ .*\.(mp3|mp4|ovg)$ {
      proxy_pass  http://***.oss-cn-beijing-internal.aliyuncs.com;
    }
    ## ...
  }
  ## ....
}

上面灰色的,需要在OSS Bucket概览页获取,修改nginx的配置之后,reload服务。

合理安排你的网站目录和域名布局

在了解上面的这两项基础之上,你需要再思考一个问题:你打算仍然用www.yourdomain.com访问你的网站和所有静态文件,还是打算另外使用一个(或几个)域名来控制你的静态文件访问。我的建议是另外分出一个static.yourdomain.com域名作为访问你的静态文件的域名,因为后面我们会使用cdn,而cdn则要求先解析域名到cdn服务商提供的地址。

那么我们接下来处理这个static域名。原来的www的所有东西都可以不同动,你需要再在nginx.conf中写一个新的server来绑定static域名。同时,这个server中必须保证:php是不能执行的,同时不能被访问(如果可以被访问,那么php文件会被下载);所绑定的根目录路径和www的是一样的,也就是说,访问static其实还是访问www,这样,原来所有的静态文件访问地址只需要替换域名,而无需修改uri;添加上面的代理配置,注意,并不是所有的文件类型都通过代理去调用OSS中的资源,例如js、css,就可以直接使用本机上的(当然,如果你觉得不嫌麻烦,或者想统一管理,其实也可以全部静态文件都丢到OSS去,包括js、css);最后,重载nginx配置,解析static域名到你的服务器IP(这时我们还没有涉及CDN)。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|eot|otf|svg|ttf|woff)$ {
    expires 30d;
}
location ~ .*\.(js|css)?${
    expires 12h;
}
# 使用OSS上面的对象
location ~ .*\.(mp3|mp4|ovg)$ {
    expires 30d;
    rewrite /(.+)$ /$1 break;
    proxy_pass http://你的bucket.oss-cn-你的城市-internal.aliyuncs.com;
}
location ~ .*\.php$ {
     deny all;
}
location ~ /\.{
    deny all;
}

如果一切顺利,你应该可以使用static域名访问你的静态文件了。但是,如上配置,你得尽快把mp3 mp4 ovg文件上传到OSS上面,而且还得保证url路径和你的网站中使用的url路径是一致的。

接下来的工作,就是把你的网站中的所有原来调用静态文件的地址,修改为static域名对应的url地址,这样,就部署完成了。

部署CDN提速网站

为了省钱,我们可以考虑去使用一些效果还可以但免费的CDN(或者收费很便宜的也行)。CDN的部署很简单,我们先注册一个CDN,将上面解析到服务器IP的static域名重新解析到CDN服务商提供的地址,再在CDN后台将源地址IP设置为我们自己的服务器IP。这样就轻松搞定了。

但是,如果你偶尔还要修改css文件,如果直接使用cdn的话,会导致css文件缓存,这不利于及时刷新界面,让访客看到最新的界面效果。解决这个问题是矛盾的,我们又希望得到cdn的提速效果,又希望及时更新文件。如果你必须使用cdn,那么只能使用付费的cdn,它们一般会提供一个api,当你更新文件的时候,可以调用这个api,让cdn主动更新对应的文件。但是,如果你实在不想这么麻烦,干脆直接使用www域名来读取css和js吧,把它们合并后输出,节省宽带,推荐小胖撰写的一篇文章《openresty+Lua+GraphicsMagick进行类似淘宝的图片处理》。

ok,通过本文的讲解,你应该掌握了通过内网获取OSS资源,然后展示在外网的方法了吧。

参考文献:

2016-02-22 20833

为价值买单

本文价值208.33RMB
已有32条评论
  1. 行星带 2019-08-26 14:44

    恕我直言,既然你要这样做,为啥不直接存服务器里呢?毕竟使用oss难道不是为了CDN加快访问速度吗?服务器的带宽可是比CDN更宝贵的资源啊。

    • 否子戈 2019-08-27 23:47

      在理
      建议条件允许的情况下上 CDN。

  2. 小白 2019-07-17 04:29

    恕我直言,你这文章小白看不懂、你还不如直接截图,做标记,怎么做,比如说你在oss存了一个视频,在你网站的用户调用如何走内网,也就是说你给的这个链接是内网调用链接……然后就是你这个内网链接怎么得出来的,这样说不是很方便?你写的都是一些看不懂的

  3. 华先生 2019-06-19 17:07

    利用自己的服务器做为中间件来获取OSS的资源,请问博主是否有遇到过《同时多人请求资源,导致服务器带宽不够,从而资源加载要进行排队》的问题呢?

    • 否子戈 2019-06-19 18:03

      这取决于你服务器的带宽,真的遇到你说的问题,就放弃本文的方案,直接使用阿里云的cdn

  4. 妙才 2019-04-18 22:25

    楼主我想加你好友,qq或微信可以吗

    • 否子戈 2019-04-20 00:04

      扫网页下面的码

  5. 妙才 2019-04-18 22:19

    是cdn回源流量,h哈哈

  6. 妙才 2019-04-18 22:17

    看到楼主的办法非常好,我就是打算做一个图片资源的网站,这个办法可以帮我省下好多oss下行流量,太感谢楼主啦

  7. 一芦居 2019-02-23 17:58

    我用的挂载方式,但是对主域名启用七牛cdn,发现没有缓存,是不是服务器nginxq还得做反定向啊

    • 否子戈 2019-02-24 09:18

      前提是你正常访问图片是可以被访问到的

  8. kajweb 2018-11-13 04:44

    反代后,esc双倍流量。。。
    那要oss干嘛,直接放本机不就好了?

    • 否子戈 2018-11-13 09:12

      要配合cdn用

  9. chancat 2018-01-20 15:01

    可以了显示提交成功 perfect

  10. chancat 2018-01-20 15:00

    谢谢回复…看到了之前我留下的很多评论….选择删除他呀

  11. chancat 2018-01-18 00:52

    博主 这个oss有容量大小的限制么?
    我有个相册站 图片就有200G了 能用这个方案么?谢谢

    呃 有个问题 在你这留言好多次 每次提交 加载然后就没反映了

    • 否子戈 2018-01-19 08:31

      oss是付费的,你这种情况建议直接使用oss和cdn配合,如果再经过ecs的话,速度会慢很多,而且并发也会受到服务器的限制。其实oss的流量费也还好,没有很贵。这篇文章只是一种idea,并不是适合所有case的。

      至于留言,是因为我的博客页面有缓存的原因,文章页的缓存是2分钟。

    • 否子戈 2018-01-19 15:50

      我排查了一下,发现原来评论提交不了不是缓存的原因,找到了两个可能,一个是session lock,一个是smtp发邮件错误。发邮件那个解决了,session lock只改了验证码那里,不知道是不是已经彻底解决了,你可以再试一下。

      • Kaey 2018-06-15 18:51

        你好我想问下上传走内网,用户查看走外网对ECS服务器资源消耗多吗

        • 否子戈 2018-06-17 15:30

          主要要考虑网络IO,相当于要占用进出口,如果网络配置比较差的话,明显会变拥挤

  12. 萝卜 2017-07-04 11:05

    ECS的带宽资源,单位价格要贵过cdn吧。再说用cdn主要是看上cdn近似无限的带宽资源和本地节点来加速静态资源的读取。这样用ecs去代理,本末倒置了吧。

    • 否子戈 2017-07-05 10:41

      批判的对,那个时候用的一个月40多块的ECS,写文章简直自黑

  13. 阿呆少爷 2017-03-14 18:23

    对了,我发现你多次把”CDN”写成了”CND”。哈哈,记得别拼错了。

    • 否子戈 2017-03-14 20:40

      谢谢指正

  14. 阿呆少爷 2017-03-14 13:53

    本来是CDN->OSS,改成CDN->ECS->OSS,CDN回源的流量省不了啊。博主的意思是如果ECS包年包月的话,这个流量是不要钱的,所以CDN回源到ECS比较划算?

    • 否子戈 2017-03-14 14:05

      确实是省着点流量钱。。。\nCDN无论到OSS还是到ECS,都无所谓回源不回源,你CDN反正都是要去拿资源的\n这篇文章里应该主要是想把存在ECS上的资源和OSS上的资源通过一个CDN出去,服务器上不存音频视频,但是代理它们,这样可以减少空间占用和IO读

      • 阿呆少爷 2017-03-14 14:32

        两种情况下,资源都放在OSS上面。CDN直接回源OSS更加方便,都不需要走到ECS上面,也不会有空间占用和IO读啊。

        • 否子戈 2017-03-14 14:46

          你说的是一种情况,理想状态下直接全部放OSS是可以的,并没有什么不妥,本文讨论的不是这种情况,讨论的就是要走ECS应该怎么去处理的情况

          • 阿呆少爷 2017-03-14 14:55

            明白啦🙃

  15. 缙哥哥 2016-08-29 09:27

    大神厉害!!!膜拜ing

  16. 莫风 2016-07-06 15:45

    static.yourdomain.com 所产生的流量不是一样要收费。

    • 否子戈 2016-07-11 15:50

      阿里云OSS内网访问是免费的,所以你的云服务器和OSS作为内网访问,不收费。当用户访问static的时候,走的流量是服务器的,所以跟OSS的公网流量是两回事。