温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
Amazon CloudFront 是由亚马逊云计算服务(AWS,Amazon Web Services)提供的一个内容分发网络服务,其在欧洲、亚洲、北美、澳洲、南美、美国多个主要大城市多地拥有自己的数据中心,共 107 个网络边际服务点(Edge Servers,即边缘服务器)提供服务。它可以加快将静态和动态 Web 内容(如 .html、.css、.js 和图像文件)分发到用户的速度,即当用户请求您用 CloudFront 提供的内容时,用户被路由到提供最低延迟 (时间延迟) 的边缘服务器,从而以尽可能最佳的性能传送内容。
关于 CDN 的部署教程,还有:
- 如何配置启用 Google Cloud CDN?
- 配置启用 Google Cloud CDN 实例详解
- 使用 CNAME 接入 CloudFlare 新玩法
- 利用 Nginx 反向代理和缓存功能自建及优化 CDN 加速节点详细教程
关于 CDN 优化教程,还有:
资费
Amazon CloudFront 是亚马逊云计算服务的重要组成部分,其标准资费分为四部分:
- 数据传出(互联网/源服务器):¥0.30866/GB(10TB 以内,用户请求边缘服务器和边缘服务器请求非 AWS 的源站都收费);
- HTTP/HTTPS 请求:¥0.11/10000 次(HTTP),¥0.15/10000 次(HTTPS);
- 失效请求:¥0.03355/条(指手动删除边缘服务器的缓存,前 1000 条免费);
- 字段级加密请求:¥0.000013/10000 个请求;
其中,AWS 免费服务提供了一定额度的免费试用:
501024 GB 数据传出;2,000,00010,000,000 个 HTTP 或 HTTPS 请求;
Amazon CloudFront 详细定价参考:
对于 AWS Educate Starter Account,除本身免费项目,所有项目均收费。预估如下:
| 项目 | 配置 | 费用(月) |
|---|---|---|
| IP | 弹性 IP | 使用中免费 |
| EC2 | t2.nano | $2.63 |
| SSD(gp2) | 10GB | $1.00 |
| 互联网 -> EC2 流量 | 按需 | 免费 |
| 互联网 -> CloudFront 流量 | 按需 | 免费 |
| EC2 -> CloudFront 流量 | 按需 | 免费 |
| EC2 -> 互联网流量 | 按需 | $0.09/G |
| CloudFront -> 互联网流量 | 按需 | $0.14/G |
| CloudFront -> EC2 流量 | 按需 | $0.06/G |
| CloudFront HTTP 请求 | 按需 | $0.009/1万个 |
| CloudFront HTTPS 请求 | 按需 | $0.012/1万个 |
按流量均分来算,开最低配 EC2($43.56),大约每月可使用传入中国大陆地区流量 33G($4)。
本文为付费文章,请先点击下方“赏” 扫码打赏 5 元,然后添加好友获取验证码,如已获得阅读权限请忽略本提示。
部署
证书
CloudFront 支持 HTTP/HTTPS,如果要使用自己的域名,且想开启 HTTPS,则需要配置 SSL 证书。CloudFront 支持自定义证书和 Amazon CA 签发的可信任证书。
CloudFront 只支持部署在弗吉尼亚北部区域(us-east-1)的证书,因此需要注意导入或者申请证书时区域应切换到弗吉尼亚北部区域(us-east-1)。
导入证书
控制台导入
打开证书管理(AWS Certificate Manager),点击导入证书:

将证书(.crt)、密钥(.key)和证书链(可选,建议一起导)填写到相应位置,然后根据页面提示审核保存证书即可:

关于 SSL 证书相关文章:
申请 Amazon 证书
AWS 提供免费 1 年期 SSL 证书(支持泛域名,可无限续订),对于使用基于 AWS 的服务都可以直接使用,因此我们可以申请 Amazon 证书来配置 CloudFront HTTPS。
打开证书管理,点击请求证书:

选择公有证书(私有证书需要另外配置私有 CA 且收费,不建议),然后点请求证书:

输入域名,方便起见,建议直接申请泛域名(如 vircloud.net、*.vircloud.net),默认第一条记录作为 SSL 证书的 Common Name,输入后点下一步:

然后根据实际情况选择验证方式,目前仅支持 DNS 和电子邮件验证(可能会同时收到很多封,因为验证邮件会同时发给admin@域名、postmaster@域名、administrator@域名、webmaster@域名、hostmaster@域名):

验证后证书自动签发生效:

Amazon 签发的证书只能在 AWS 中使用,不可导出。
分配
证书导入或申请好后,我们就可以开部署分配 CloudFront 了。
打开 CloudFront 管理界面,点击创建分配:

分发方式选择 Web:

源设置这里,源域名是指专门分配给 CloudFront 来加速真正网站的域名,不是实际要开放给大家访问的真正网站。啥意思呢,就是说如果开放访问的真正做站的域名是 www.vircloud.net,那么在这里设置的源域名就不可以是 www.vircloud.net,否则会无限循环;我们可以在源站 www.vircloud.net 上额外增加一个域名,比如 cloudfront.vircloud.net,实际上访问这两个域名内容是一模一样的:

默认缓存行为设置这里,根据实际情况选择查看器协议策略、源请求策略,每个的策略具体作用可以点击下方的“查看策略详细信息”:

分配设置这里,备用域名(CNAMEs)要填写真正做站的域名是 www.vircloud.net,否则将只能使用 CloudFront 分配的域名;SSL 证书则选择前面导入或申请的证书;其他配置保持默认,然后点创建分配即可:

注意:
1、对于不确定的设置项,可以点旁边的感叹号查看说明;
2、源站若启用 SSL,要让 CloudFront 也使用 https 访问源站,则源站 SSL 证书必须使用包含根证书的完整证书链,否则报 502 错误。
稍等片刻,待分配状态变成已部署后,CloudFront CDN 就部署成功可以使用了。

解析
CloudFront CDN 部署成功后会分配一个 *.cloudfront.net 的域名:

我们在 DNS 服务商处,添加一笔 CNAME 解析记录即可:

然后我们就可以访问使用 CloudFront CDN 加速的网站了。
自选
CloudFront 和 CloudFlare 一样,接入之后可以自选优质 IP(连接相对更稳定、延迟相对更低、带宽相对更能跑满)。原理也是类似的:
- 通过 NMAP 等工具扫描 CloudFront IP 段,批量测试 IP 的延迟和端口开放情况,选出最佳 IP;
- 在 DNS 处删掉前面加的 CNAME 记录,直接通过 A 记录指定 IP,或者本地 hosts 指定。
扫描脚本
脚本
#!/usr/bin/env python
import threading
import requests
import Queue
import sys
import re
#ip to num
def ip2num(ip):
ip = [int(x) for x in ip.split('.')]
return ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3]
#num to ip
def num2ip(num):
return '%s.%s.%s.%s' % ((num & 0xff000000) >> 24,(num & 0x00ff0000) >> 16,(num & 0x0000ff00) >> 8,num & 0x000000ff)
#
def ip_range(start, end):
return [num2ip(num) for num in range(ip2num(start), ip2num(end) + 1) if num & 0xff]
#
def bThread(iplist):
threadl = []
queue = Queue.Queue()
for host in iplist:
queue.put(host)
for x in xrange(0, int(SETTHREAD)):
threadl.append(tThread(queue))
for t in threadl:
t.start()
for t in threadl:
t.join()
#create thread
class tThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while not self.queue.empty():
host = self.queue.get()
try:
checkServer(host)
except:
continue
def checkServer(host):
header ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
aimurl = "http://"+host+":443"
response = requests.get(url=aimurl,headers=header,timeout=10)
serverText = response.headers['server']
if len(serverText) > 0:
print "-"*50+"\n"+aimurl +"\nServer: "+serverText
if (serverText == "CloudFront"):
f.write(host+"\n")
if __name__ == '__main__':
print '\n############# Cloud Front Scan ################'
print ' Author hostloc.com'
print '################################################\n'
global SETTHREAD
try:
SETTHREAD = sys.argv[2]
f = open("result.txt", "w")
iplist = ip_range(sys.argv[1].split('-')[0], sys.argv[1].split('-')[1])
print '\n[Note] Will scan '+str(len(iplist))+" host...\n"
bThread(iplist)
except KeyboardInterrupt:
print 'Keyboard Interrupt!'
sys.exit()用法
工具:Python 2.7,不支持其他版本
命令:
python cfscan.py 183.201.1.1-183.201.1.255 800参数:
cfscan.py = 脚本文件名
183.201.1.1-183.201.1.255 = 扫描的起始 IP - 结束 IP
800 = 线程数其他
命令行导入 SSL 证书
对于部分账号(比如 AWS Educate Starter Account),从控制台无法导入证书,那么可以通过官方 CLI 命令行来导入。
安装 AWS CLI
以 Ubuntu 18.04 为例(其他平台可参见官方文档):
ubuntu@aws-us:~$ sudo -i
root@aws-us:~# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 32.1M 100 32.1M 0 0 54.7M 0 --:--:-- --:--:-- --:--:-- 54.7M
root@aws-us:~# unzip awscliv2.zip
Archive: awscliv2.zip
creating: aws/
creating: aws/dist/
inflating: aws/THIRD_PARTY_LICENSES
inflating: aws/README.md
inflating: aws/install
.......
creating: aws/dist/zlib/cpython-37m-x86_64-linux-gnu/
inflating: aws/dist/zlib/cpython-37m-x86_64-linux-gnu/soib.cpython-37m-x86_64-linux-gnu.so
root@aws-us:~# ./aws/install
You can now run: /usr/local/bin/aws --version
获取 access_key
登录控制台后,然后打开 AWS Account

点击 Account Details:

show 其中的 AWS CLI,这一部分就是我们要的验证密钥:

将密钥复制到本地:
root@aws-us:~# mkdir .aws
root@aws-us:~# vim .aws/credentials
[default]
aws_access_key_id=
aws_secret_access_key=
aws_session_token=
注意密钥的有效期每次只有 3 个小时,超时了就重新操作一遍获取新的密钥。
上传证书
假设证书为 public_key_cert_file.pem,密钥为 my_private_key.pem,证书链为 my_certificate_chain_file.pem,则上传证书的命令为:
root@aws-us:~# aws iam upload-server-certificate --path /cloudfront/aws/ --server-certificate-name myServerCertificate --certificate-body file://public_key_cert_file.pem --private-key file://my_private_key.pem --certificate-chain file://my_certificate_chain_file.pem
{
"ServerCertificateMetadata": {
"Path": "/cloudfront/aws/",
"ServerCertificateName": "www.vircloud.net",
"ServerCertificateId": "xxxxxxx",
"Arn": "arn:aws:iam::xxxxx:server-certificate/cloudfront/aws/www.vircloud.net",
"UploadDate": "2020-09-09T08:03:19+00:00",
"Expiration": "2021-09-09T12:00:00+00:00"
}
}响应 json 说明上传成功
参数说明:
--path:证书路径(AWS 上的)
--server-certificate-name:证书名称
--certificate-body:证书公钥完整文件路径(路径前加 file://,如 file:///root/public_key_cert_file.pem)
--private-key:证书私钥完整文件路径(路径前加 file://)
--certificate-chain:证书链完整文件路径(路径前加 file://)其他命令
列出证书清单:
root@aws-us:~# aws iam list-server-certificates
{
"ServerCertificateMetadataList": [
{
"Path": "/cloudfront/aws/",
"ServerCertificateName": "www.vircloud.net",
"ServerCertificateId": "A5",
"Arn": "arn:aws:iam::1:server-certificate/cloudfront/aws/www.vircloud.net",
"UploadDate": "2020-09-10T01:16:15+00:00",
"Expiration": "2021-09-09T12:00:00+00:00"
}
]
}删除指定证书:
root@aws-us:~# aws iam delete-server-certificate --server-certificate-name www.vircloud.net证书上传错误
错误提示:om.amazonaws.services.cloudfront.model.InvalidViewerCertificateException: The specified SSL certificate doesn't exist, isn't in us-east-1 region, isn't valid, or doesn't include a valid certificate chain.
**原因分析:证书必须为 2048 位或以下。Let's Encrypt 默认 3072 位。
CloudFront 无法解析
错误提示:用着好好的突然打不开,提示无法解析,ping 也提示找不到主机;
原因分析:这个问题集中出现在 AWS Educate Starter 账号上,可能是 Starter 账号本身就无法使用 CloudFront 服务(面板上没有证书权限),可以尝试直接使用 CloudFront 分配的域名。
JS 测试 WS 连通性
即通过浏览器 Console 来测试 WebSocks 是否畅通,使用原生 JavaScript:
var ws = new WebSocket("wss://websocks 地址");
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) {
console.log("Connection closed.");
}; 如果畅通,则稍等片刻返回的是:
Connection open ...再过一会儿返回:
Connection closed.如果返回的是其他内容,则表示无法正常工作。
参考文章:
1、《AWS CloudFront 建站缓存策略(适用于棉被,解决403错误)》
2、《CloudFront+WordPress实现全站CDN》
3、《AWS Educate Starter Account(教育AWS)使用CloudFront(CDN)上传SSL证书》
Windows 10Chrome 133.0.0.0来自 美国 的大神
作者你好!
我看到有一些CF优选、CFT优选的其他资源,您看一下怎么样。
CF优选域名、CloudFlare优选域名:
*.cloudflare.182682.xyz
CF优选地址、CloudFlare优选地址:
https://www.wetest.vip/page/cloudflare/address_v4.html
https://www.wetest.vip/page/cloudflare/address_v6.html
CFT优选域名、CloudFront优选域名:
*.cloudfront.182682.xyz
CFT优选地址、CloudFront优选地址:
https://www.wetest.vip/page/cloudfront/address_v4.html
https://www.wetest.vip/page/cloudfront/address_v6.html
优选IP自动解析工具:
https://github.com/gacjie/cf2dns