← Back to Blog

通过EdgeOne实现Oracle对象存储的全球加速

by HeLong

0. 说明

目前,我的博客托管在 EdgeOne,而图床则基于 Oracle 对象存储,并通过 Cloudflare Workers 实现 CDN 加速。相较于自建对象存储方案,云厂商的对象存储通常功能更丰富,管理也更便捷。

OCI Object Storage 的优势:

  • 预授权支持:即使存储桶设为私有,仍可通过授权码(Pre-Signed URL)安全访问,方便 Web 应用集成。

  • 高可靠性:作为企业级云服务,提供持久性和可用性保障。

  • S3 兼容:可无缝对接各类支持 S3 协议的工具和框架。

这样一来,既能享受免费额度,又能获得企业级存储服务的稳定性和功能优势。

Cloudflare

Cloudflare作为全球领先的边缘网络平台,提供三大核心价值:极速内容分发、全方位安全防护和智能边缘计算。其300多个全球节点构成的CDN网络可显著降低访问延迟,内置的DDoS防护和WAF防火墙能有效抵御各类网络攻击。通过边缘Worker无服务器计算,开发者可以在靠近用户的位置运行业务逻辑,配合自动HTTPS加密和HTTP/3支持,在保障安全的同时优化传输效率。Cloudflare的免费套餐包含这些核心功能,使其成为提升网站性能和安全性最具性价比的选择。

EdgeOne

EdgeOne 作为专为中国市场优化的全球加速服务,通过本土化节点布局和智能路由技术,为国内用户提供极速访问体验。其在国内部署的高质量边缘节点有效规避跨境网络延迟,配合智能缓存策略,使资源加载速度提升40%以上,实现"全球加速,本地体验"。

Cloudflare访问速度测试结果
Cloudflare访问速度测试结果
EdgeOne加速后的访问速度测试结果
EdgeOne加速后的访问速度测试结果

1. 创建储存桶

  1. 登录 Oracle 控制台,选择 Object Storage(对象存储) 服务
  2. 创建新的存储桶
Oracle控制台创建存储桶界面
Oracle控制台创建存储桶界面

储存桶名称任意

存储桶名称设置界面
存储桶名称设置界面
  1. 设置访问权限为私有

此时该存储桶不能访问。注意可见性设置,如果设置为公共,那么将允许匿名用户和未通过身份验证的用户访问该存储桶中存储的数据,这样是不安全的。建议保持专用,通过 Cloudflare 免费 CDN 访问专用存储桶的资源。

  1. 创建访问密钥(使用插件或软件上传图片)

通过控制面板-右上角用户头像-我的概要信息-安全-下滑创建客户密钥

Oracle用户概要信息中创建客户密钥页面
Oracle用户概要信息中创建客户密钥页面

记录 Secret key 和 Access key ID

bash|4 lines
1
2
3
4
region #是当前账户资源区域 region=us-ashburn-1。
bucket #存储桶详细信息中的名称空间:idd****edn。
endpoint #https://compat.objectstorage.<region>.oraclecloud.com/<name> 此处为设置的存储桶名称。
S3_URL #客户端得到的 URL 为 https://<名称空间>.compat.objectstorage.<region>.oraclecloud.com/<存储桶名称>/<key>。

此时已经可以通S3标准访问此存储桶,但是为了后续使用Cloudflare CDN,我们需要生成预授权URL

  1. 生成预授权URL

预先验证的请求允许访问存储桶对象而不需要提供访问密钥。

进入创建的存储桶,选择预授权URL

存储桶中创建预授权URL界面
存储桶中创建预授权URL界面

创建并设置过期时间。

至此,存储桶已经创建完成,可以进行下一步。

2. Cloudflare Workers 以及缓存设置(适用于域名无备案无法使用EdgeOne国内节点的情况)

此部分内容参考:平凡的路-博客 相关内容,所有引用的文本都可以在原有博客查找相关信息,如有侵权请联系删除。

此处的[domain] 代指你的域名

首先,假设你有 你一定有至少一个域名托管与 Cloudflare 以使用相关服务~

常规的 CDN 模式是:用户 -> Cloudflare 服务器 -> Source 服务器。这种方式只需要在 Cloudflare 托管域名,使用 CNAME 并开启代理(点亮小云朵)即可。然而对于 Oracle 对象存储,无论可见性是公共还是专用,都无法实现代理。这是因为 Oracle 对象存储的域名里面包含存储桶的 bucket 和 region 信息,Cloudflare 访问源服务器时并不会使用源服务器域名,而是使用 Cloudflare 托管的域名,这样一来 Oracle 服务器就不能正常处理请求了。(企业版订阅用户可以通过规则重写 Host HTTP Header。Cloudflare 解释说普通用户不允许是出于安全考虑。)

因此,我们需要使用 Workers 作为中间层,来转发请求到 Oracle 对象存储。

1. 创建 Workers 插入以下代码:

js|179 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
const FileMimeType = {
  'audio/x-mpeg': ['mpega'],
  'video/3gpp': ['3gpp', '3gp'],
  'application/postscript': ['ps', 'eps', 'ai'],
  'audio/x-aiff': ['aiff'],
  'application/x-aim': ['aim'],
  'image/x-jg': ['art'],
  'video/x-ms-asf': ['asx', 'asf'],
  'audio/basic': ['ulw'],
  'video/x-msvideo': ['avi'],
  'video/x-rad-screenplay': ['avx'],
  'application/x-bcpio': ['bcpio'],
  'image/bmp': ['dib'],
  'text/html': ['html', 'htm', 'shtml'],
  'application/x-cdf': ['cdf'],
  'application/pkix-cert': ['cer'],
  'application/java': ['class'],
  'application/x-cpio': ['cpio'],
  'application/x-csh': ['csh'],
  'text/css': ['css'],
  'application/msword': ['doc'],
  'application/xml-dtd': ['dtd'],
  'video/x-dv': ['dv'],
  'application/x-dvi': ['dvi'],
  'application/vnd.ms-fontobject': ['eot'],
  'text/x-setext': ['etx'],
  'image/gif': ['gif'],
  'application/x-gtar': ['gtar'],
  'application/x-gzip': ['gz'],
  'application/x-hdf': ['hdf'],
  'application/mac-binhex40': ['hqx'],
  'text/x-component': ['htc'],
  'image/ief': ['ief'],
  'text/vnd.sun.j2me.app-descriptor': ['jad'],
  'application/java-archive': ['jar', 'war', 'ear'],
  'text/x-java-source': ['java'],
  'application/x-java-jnlp-file': ['jnlp'],
  'image/jpeg': ['jpg', 'jpeg'],
  'application/javascript': ['js'],
  'text/plain': ['txt'],
  'application/json': ['json'],
  'audio/midi': ['midi', 'mid', 'kar'],
  'application/x-latex': ['latex'],
  'audio/x-mpegurl': ['m3u'],
  'image/x-macpaint': ['pnt'],
  'text/troff': ['tr'],
  'application/mathml+xml': ['mathml'],
  'application/x-mif': ['mif'],
  'video/quicktime': ['qt'],
  'video/x-sgi-movie': ['movie'],
  'audio/mpeg': ['mpa'],
  'video/mp4': ['mp4', 'm4v'],
  'video/mpeg': ['mpg', 'mpeg'],
  'video/mpeg2': ['mpv2'],
  'application/x-wais-source': ['src'],
  'application/x-netcdf': ['nc'],
  'application/oda': ['oda'],
  'application/vnd.oasis.opendocument.database': ['odb'],
  'application/vnd.oasis.opendocument.chart': ['odc'],
  'application/vnd.oasis.opendocument.formula': ['odf'],
  'application/vnd.oasis.opendocument.graphics': ['odg'],
  'application/vnd.oasis.opendocument.image': ['odi'],
  'application/vnd.oasis.opendocument.text-master': ['odm'],
  'application/vnd.oasis.opendocument.presentation': ['odp'],
  'application/vnd.oasis.opendocument.spreadsheet': ['ods'],
  'application/vnd.oasis.opendocument.text': ['odt'],
  'application/vnd.oasis.opendocument.graphics-template': ['otg'],
  'application/vnd.oasis.opendocument.text-web': ['oth'],
  'application/vnd.oasis.opendocument.presentation-template': ['otp'],
  'application/vnd.oasis.opendocument.spreadsheet-template': ['ots'],
  'application/vnd.oasis.opendocument.text-template': ['ott'],
  'application/ogg': ['ogx'],
  'video/ogg': ['ogv'],
  'audio/ogg': ['spx'],
  'application/x-font-opentype': ['otf'],
  'audio/flac': ['flac'],
  'application/annodex': ['anx'],
  'audio/annodex': ['axa'],
  'video/annodex': ['axv'],
  'application/xspf+xml': ['xspf'],
  'image/x-portable-bitmap': ['pbm'],
  'image/pict': ['pict'],
  'application/pdf': ['pdf'],
  'image/x-portable-graymap': ['pgm'],
  'audio/x-scpls': ['pls'],
  'image/png': ['png'],
  'image/x-portable-anymap': ['pnm'],
  'image/x-portable-pixmap': ['ppm'],
  'application/vnd.ms-powerpoint': ['pps'],
  'image/vnd.adobe.photoshop': ['psd'],
  'image/x-quicktime': ['qtif'],
  'image/x-cmu-raster': ['ras'],
  'application/rdf+xml': ['rdf'],
  'image/x-rgb': ['rgb'],
  'application/vnd.rn-realmedia': ['rm'],
  'application/rtf': ['rtf'],
  'text/richtext': ['rtx'],
  'application/font-sfnt': ['sfnt'],
  'application/x-sh': ['sh'],
  'application/x-shar': ['shar'],
  'application/x-stuffit': ['sit'],
  'application/x-sv4cpio': ['sv4cpio'],
  'application/x-sv4crc': ['sv4crc'],
  'image/svg+xml': ['svgz'],
  'application/x-shockwave-flash': ['swf'],
  'application/x-tar': ['tar'],
  'application/x-tcl': ['tcl', 'tk'],
  'application/x-tex': ['tex'],
  'application/x-texinfo': ['texinfo'],
  'image/tiff': ['tiff', 'tif'],
  'text/tab-separated-values': ['tsv'],
  'application/x-font-ttf': ['ttf'],
  'application/x-ustar': ['ustar'],
  'application/voicexml+xml': ['vxml'],
  'image/x-xbitmap': ['xbm'],
  'application/xhtml+xml': ['xhtml'],
  'application/vnd.ms-excel': ['xls'],
  'application/xml': ['xsl'],
  'image/x-xpixmap': ['xpm'],
  'application/xslt+xml': ['xslt'],
  'application/vnd.mozilla.xul+xml': ['xul'],
  'image/x-xwindowdump': ['xwd'],
  'application/vnd.visio': ['vsd'],
  'audio/x-wav': ['wav'],
  'image/vnd.wap.wbmp': ['wbmp'],
  'text/vnd.wap.wml': ['wml'],
  'application/vnd.wap.wmlc': ['wmlc'],
  'text/vnd.wap.wmlsc': ['wmls'],
  'application/vnd.wap.wmlscriptc': ['wmlscriptc'],
  'video/x-ms-wmv': ['wmv'],
  'application/font-woff': ['woff'],
  'application/font-woff2': ['woff2'],
  'model/vrml': ['wrl'],
  'application/wspolicy+xml': ['wspolicy'],
  'application/x-compress': ['z'],
  'application/zip': ['zip'],
};

const fileMimeType = {}
for (const k in FileMimeType) {
  FileMimeType[k].forEach((ext) => {
    fileMimeType[ext] = k;
  });
}

// 棰勫厛楠岃瘉鐨勮姹� URL
const OOS_BUCKET_PREAUTH_URL = '<浣犲垱寤虹殑棰勫厛楠岃瘉鐨勮姹� URL>';

const preAuthURL = new URL(OOS_BUCKET_PREAUTH_URL);

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const host = url.host
    url.host = preAuthURL.host;
    url.pathname = preAuthURL.pathname + url.pathname.substring(1);

    const newRequest = new Request(url, request);
    newRequest.headers.set('X-Forwarded-Host', host)
    const response = await fetch(newRequest);

    let contentType = response.headers.get('Content-Type');
    if (contentType && contentType != 'application/octet-stream') {
      return response
    }

    const newResponse = new Response(response.body, {
      headers: response.headers,
      status: response.status,
      statusText: response.statusText,
    });
    const ext = url.pathname.split('.').pop();
    contentType = fileMimeType[ext];
    if (contentType) {
      newResponse.headers.set('Content-Type', contentType);
    }
    return newResponse
  },
};

替换OOS_BUCKET_PREAUTH_URL 为你为存储桶创建的预先验证的请求 URL

添加二级域名,类型 CNAME,名字为 oss,目标任意,开启代理(小黄云)。之后 oss.[domain] 的流量会接入到 Cloudflare。

添加 Workers 路由oss.[domain]/*,作用是:将 oss.[domain] 的所有流量转发到 Workers。

Cloudflare Workers路由设置界面
Cloudflare Workers路由设置界面

2. 缓存设置

主页进入域名

Cloudflare域名缓存设置入口
Cloudflare域名缓存设置入口

点击创建规则

创建缓存规则按钮
创建缓存规则按钮

创建缓存规则

缓存规则类型选择界面
缓存规则类型选择界面

创建“缓存 Everything”规则

缓存Everything规则配置界面
缓存Everything规则配置界面

匹配值填写oss.[domain]/*

至此,已经可以使用 oss.[domain] 访问 Oracle 对象存储了,但是为了国内加速,建议使用 EdgeOne 进行加速。

3. 使用 EdgeOne 加速访问(如果域名有备案,EdgeOne 可以开启全球可用区,国内首选)

  1. 登录 EdgeOne 控制台,选择加速域名
  2. 点击域名服务 --> 域名管理 --> 添加域名
  3. 填写加速域名 oss.[主要域名]
  4. 选择对象存储源站
EdgeOne域名服务添加域名界面
EdgeOne域名服务添加域名界面
  1. 源站类型选择 s3 兼容,需要填写的内容如下:
EdgeOne S3兼容源站配置界面
EdgeOne S3兼容源站配置界面
  • 源站地址:命名空间.compat.objectstorage.区域代码.oraclecloud.com
  • 鉴权版本必须选择 AWS signature v4

以下项目在 Oracle 对象存储不受支持:虚拟主机式访问以及 AWS 签名版本 2 (SigV2)

  • 地域、Access Key ID 以及 Secret Access Key 为控制台获取的相关信息。

图片访问路径为:https://oss.example.com/bucket-name/image-key

  1. 保存设置
  2. 配置SSL证书

Enjoy!

图片来自-哲风壁纸
图片来自-哲风壁纸

Comments