说明

本文的目的是通过Nginx反向代理,使我们在外网访问OSS资源时,让处在同一区域的阿里云ECS通过内网通道访问OSS中的资源(本文指图片),可以避免OSS中文件被浏览时产生的外网流出流量费用,但是通过ECS访问时,会受到服务器带宽的影响,可能会影响您的图片加载速度
当然,实现本文的效果需要您具备以下前提:

  1. 您购买了阿里云对象存储OSS服务
  2. 您购买了阿里云服务器

前言

前两天买了阿里云的OSS对象存储服务,目的是为了搞个自己的图床,原来是用的Gitee的,速度也挺快,但因为仓库只能设为共有才能正常访问,所有文件都是公开的,老觉得差点意思,便瞎折腾了一下。

图床是建好了,也传了不少图片试了试,速度挺快,并且使用阿里云的OSS-Browser上传/删除文件也很方便。但是这两天收到邮件说我有欠费待结清,虽然只是由几毛到两三块钱,也不多。但我当时好歹买了40G空间的OSS,才用了1G不到,怎么会欠费呢?实在有点纳闷。

于是我打开阿里云,看了一下账单详情,好家伙,全是OSS对象存储产生的费用,要知道OSS买40G一年才花了9块钱,这两天就快到半年的钱了,对比一下可不算少,让向来喜欢白嫖的我心头滴了半滴血,这咋回事呀?

OSS费用

于是我先打开了对象存储OSS详细价格信息,不看不知道,一看吓一跳,罪魁祸首就在这里:

可以看到流量费用中外网流出流量是需要付费的,而图片在网站/文章中加载,都属于外网。什么意思呢?花的9块钱只是买了个缸,这缸只能在自己家放着,往里面放米?可以啊,随便放,只要不溢出来就行。想吃?当然可以,您就围着缸吃吧,带出去另外掏钱(当然,您也可以花钱购买相对应的流量包)!

那敢情买了个40G的OSS只能上传文件,想让别人看看还得再出点血了,这与我购买OSS的目的背道而驰,不禁让我想起了某度盘看着满满的资源,几k每秒下载速度的窘境,甚至都想把前两天刚备份到某阿盘的文件再下下来放到移动硬盘里,我不禁长吁了一口气

不能让某阿得逞!我在心里暗暗较劲,于是我又看了一眼价格信息,内网流出流量是免费的,那我能不能用什么方法在外网使用内网通道访问OSS中的资源呢?

解决办法

首先我看到了阿里云帮助中心的这篇文档ECS实例通过OSS内网地址访问OSS资源,文档中说的很清楚:

通过OSS内网地址访问OSS资源有以下两种方式:

  • 与OSS同地域ECS实例可以直接通过内网访问有权限的OSS资源;
  • 与OSS不同地域的ECS实例或公网用户可通过配置ECS反向代理,间接实现通过OSS内网地址访问OSS资源。

这两种方式中第一种其实是说如果你在同区域中的服务器中,可以直接访问该区域中的OSS资源,只要使用相应资源的内网地址即可,这个也比较好理解,大概就是是同区域ECS和OSS处在同一个局域网中;第二种的话需要使用反向代理。

下面先来演示一下第一种的访问形式:

服务器内直接访问

首先我在华北3(张家口)创建(创建时需要与服务器区域一致)了一个用于测试的Bucket,名字为 hiyoung-test

然后我们点击该Bucket,并打开该Bucket的概览,可以看到它的内网访问地址:

在这个测试Bucket中的根目录,上传了一张图片 sheep.jpg

那么该图片的内网访问地址应该为 hiyoung-test.oss-cn-zhangjiakou-internal.aliyuncs.com/sheep.jpg

然后登录同处在华北3(张家口)的服务器,此处我服务器的操作系统为Windows,打开该服务器中的IE浏览器,在地址栏中先输入Bucket的地址 http://hiyoung-test.oss-cn-zhangjiakou-internal.aliyuncs.com/,可以看到展示的是一个xml文件的内容,它其实展示的就是该Bucket的基本信息,也可以看到Bucket中储存的内容,比如上传图片的信息,包括名称,修改日期等等

接下来在地址栏中输入 http://hiyoung-test.oss-cn-zhangjiakou-internal.aliyuncs.com/sheep.jpg,也就是图片的地址,出现了安全警报信息:

这说明IE在进行文件下载操作,说明我们离成功已经很近了,接下来需要更改一些安全设置,在 Internet选项——安全——自定义级别,在打开的安全设置窗口中,下拉到 下载功能,找到 文件下载点击 启用

再次输入图片地址并回车,可以看到文件要开始下载了,说明内网访问OSS中的图片成功,当然,如果你不想直接下载,而是在网页中预览,则需要绑定自定义域名

接下来介绍第二种访问方式:

反向代理通过内网通道访问

其实,在阿里云帮助文档中,已经有各种系统都比较完整的配置过程:

反向代理其实就是将OSS中的资源地址通过反向代理工具,映射给代理服务器,然后当外网需要访问OSS中的资源时,直接访问代理服务器地址就可以,代理服务器会将外部请求传递给内部OSS,然后再将内部OSS中的资源传递给外部,这样外部便可以使用代理服务器地址访问内部OSS。引用网上对反向代理描述的一句话,觉得很形象:“反向代理就像在饭店吃饭一样,你点了好多菜,然后服务员把菜单分配给下面的厨师们做,然后你并不知道你吃的菜是哪位师傅做的”,对于目前的这种情况来说,OSS中的文件就是厨师们做的菜,而OSS可以有多个,也就相当于不同的厨师,外面要访问OSS中的文件时,通过代理服务器,将OSS中的菜给你端上来,你并不知道内部安排的是哪个厨师,但只要菜对味就行,反向代理已经帮你安排好了。

但是反向代理之后外网访问跟ECS的带宽有关,如果带宽很小,则访问速度捉急。

反向代理结果

看着许久还没消失的Uploading印记,我慢慢闭上了眼,心底的无奈涌上心头,默默说了句:淦,还是我输了,这龟速,又白忙活一天!

窗外的雪越下越大,我提起手抹了抹嘴,自言自语道:“妈的,还是白嫖香,OSS就是个弟弟!”

相关链接及参考