今年1月份建立了我的个人博客 ,最开始网站和图片都放在Github Page上。稳定运行了一段时间后,看到不少反馈Github Page境内访问较慢,从此MrHuangTalk就可以是访问速度优化之路,经过几次搬迁和优化,从Github Page搬到Cloudflare Page,后来又搬到了Vercel,再后来又把页面中使用的图片单独拆出来放到不同的CDN,现在整个架构是这样的。
整个过程不用写任何代码,仅通过在网页上配置就可实现。下面讲讲实现此架构的一些关键地方,各服务商的帮助文档关键节点写的比较简单,还得自己摸索。
网站CDN选择
通过测速网站,选了速度最快的Vercel。但也看到有人说测速网站是Vercel快,实际使用感受是Cloudflare快。如果你访问速度较慢,也请告知我(mrhuang@mrhuangtalk.com)。
使用国内CDN服务的前提
需要有一个通过ICP备案的域名。很不幸,从22年5月9日后,腾讯云就不提供默认的CDN域名给用户,这就意味着如果需要使用国内的CDN服务,必须要有一个备案的域名。
不死心看了阿里云和华为云,都没有提供默认CDN域名,只能使用用户自定义域名。还好ICP备案相对简单,只要资料填写完整,审批通过还是很容易的。
所以不得已注册了mrhuang.sapce域名,为了备案,干脆又建了个我的摄影照片分享网站。也是静态网站,用了hugo 来搭建。
使用AWS S3搭建境内CDN加速服务
虽然腾讯云也有存储桶,可以直接使用腾讯云的CDN实现全球加速。一开始我也是这样部署的,结果发现放在境内存储桶和CDN的数据(阿里云也一样),Twitter等无法访问,导致我的Twitter帖子中的Twitter Card无法显示 。没办法,只能通过境内外分开部署解决。
配置AWS S3访问账号
通过AWS IAM新建用户,权限设置为“AmazonBraketFullAccess”,记录好ID和密匙,以及用户 ARN。
修改S3存储桶的权限,使新建的用户具有只读权限。Princepal下AWS中填写新建用户的ARN,Action下配置“s3:GetObject”代表只读,Resource下填写存储桶的ARN名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "Stmt1655173479141",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::895535443196:user/myuser"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mys3******/*"
}
]
}
腾讯云创建境内CDN
新建域名,加速区域选择中国境内,加速域名填入已经完成备案的二级域名(如:img.mrhuang.space),源站配置选择第三方AWS S3,源站地址按格式填写。
由于S3为了安全性关闭了公有读,所以还需设置“回源鉴权”,访问ID和密匙填入之前在AWS IAM新建用户时保存好的信息。
在域名管理DNS设置里设置好CNAME后,境内CDN加速就配置好了。
境内境外分流
腾讯域名管理免费版可以通过境内、境外不同线路进行解析,境外用户解析到AWS Cloudfront,境内用户解析到腾讯云CDN。
配置SSL证书
由于AWS Certificate Manager申请的证书只能导入无法导出,所以在腾讯云域名管理免费申请SSL证书,证书申请下来后可以很方便把证书应用到腾讯云新建的境内CDN。
下载申请好的证书,使用Nginx格式。
进入AWS Certificate Manager,导入证书。注意区域选择“美国东部 (弗吉尼亚北部)(us-east-1)”,只有美国东部的证书能用于AWS Cloudfront CDN。
用vs code打开xxx.mrhuang.space_bundle.pem,把第一部分BEGIN CERTIFICATE与END CERTIFICATE之间的内容填入证书正文,xxx.mrhuang.space.key的内容填入证书私钥。注意必须是RSA格式的私钥。
AWS Cloudfront 使用导入的证书
为S3配置好Cloudfront CDN后,增加与腾讯云一致的自定义域名,并使用刚刚导入的证书。
通过dig命令简单测试下,不同地址访问img.mrhuang.space相应的域名,境内返回腾讯云CDN地址,境外返回AWS CDN地址。
通过 Twitter Card Validator 验证成功,至此所有配置完成。