阿里云oss图片存储服务通过nginx转发至外网

公司采用了阿里云的oss来存储大量图片,oss存储很方便,存储的图片可直接通过url地址访问,但是也有个问题,外网访问oss文件需要通过流量计费,而内网访问不计流量费用。原本我们就有阿里云服务器,既然如此是否可通过在阿里云服务器上的nginx进行转发,这样就可达到即可访问oss又不需要单独计费的外网流量。

一、基础条件

1、申请OSS对象存储
首先你得有个阿里云的OSS对象存储包,可以先买个便宜的测试一下功能,反正后续想要继续用随时可以进行升级。
OSS对象存储购买地址:https://www.aliyun.com/product/oss?utm_content=se_1272355

2、当然了你还得有个Nginx这个软件,搭建的话我这里就不介绍了,网上还是很多的。

二、开始配置

1、OSS创建存储空间Bucket(可以理解为一个放资源的仓库,一个阿里云账号可以创建多个Bucket,但是Bucket的名字是全网唯一的,并且访问资源的时候也是要用Bucket访问,取名字的时候尽量不要太复杂)
登录OSS 管理控制台。
单击左侧存储空间列表中的新增按钮+,或者单击页面右上方的新建 Bucket按钮,打开新建 Bucket对话框

配置如下,设置公共读是为了好测试,因为设置私有的话用nginx访问还需要验证要加token,比较麻烦

可以看到bucket已经创好了,并且给了外网访问地址,当然你直接打地址是没用的,需要跟上资源目录。

2、创建Object (文件夹)
点击文件管理—>创建目录
我这里的话创建一个叫resource的目录,具体的名字可以自己创建,因为开发人员是需要这样的名字,我就创建了

最终我创建的目录结构是这样,再把对应的图片上传上去就可以了,上传的话可以通过api,sdk等接口直接上传,也可以通过阿里云的web界面直接点击上传

Nginx配置
OSS创建好Bucket和object以后,可以开始配置Nginx了,Nginx配置很简单,只需要加一个location去匹配即可

1
2
3
location ^~ /resource/images/oss {   
proxy_pass http://bucket名.oss-cn-shenzhen-internal.aliyuncs.com;
}

意思就是匹配到链接里有/resource/images/oss这样的后缀以后直接去相应的oss域名上请求资源
相应的域名和目录名可以在oss的控制台里查看

Nginx配置好以后测试一下

三、测试

进入OSS的object里面找一张图片点击预览

在浏览Nginx配置的网站后面跟上这个路径 显示OK
我Nginx配置的主页域名是test.fhtest.com
图片的路径是/resource/images/oss/patent_info/100000138/200720154979.gif
直接打test.fhtest.com/resource/images/oss/patent_info/100000138/200720154979.gif 能够正常访问


也可以在nginx的配置文件中使用proxy_set_header Host进行配置
下面是目前的针对阿里云 OSS 的 Nginx 反向代理的具体配置,供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
location ~ ^/image_oss/.*\.(jpg|png|jpeg)$ {
proxy_pass http://<bucket>.oss-cn-shanghai-internal.aliyuncs.com;

proxy_redirect off;
proxy_set_header Host '<bucket>.oss-cn-shanghai-internal.aliyuncs.com';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_cache_valid 200 302 3600m;

proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_read_timeout 600s;
proxy_send_timeout 300s;
proxy_temp_file_write_size 256k;

expires max;
etag off;
}

proxy_set_header 中 Host 必须要设定自己对应的主机名,例如我的阿里云 OSS 对应的主机在华东2(也就是上海机房)阿里云 OSS 是根据 Host 确定 Bucket 的名称的。顺便提一句,如果 Nginx 主机也是和 OSS 同个机房,那么可以使用内部 VPC 内网节省流量。
由于反向代理的是静态资源,所以我考虑尽可能的多缓存时间以加快速度和减少请求流量,所以设置了 proxy_cache_valid 200 302 3600m 以及 expires max 强制缓存。

参考:
配置Nginx访问OSS对象存储静态资源
使用 Nginx 反向代理阿里云 OSS
阿里云oss图片存储服务通过nginx转发至外网
扩展阅读:
阿里云OSS防盗链