AWS CloudFront CDN 详细图文部署教程及优选自选优质 IP 方法

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

Amazon CloudFront 是由亚马逊云计算服务(AWS,Amazon Web Services)提供的一个内容分发网络服务,其在欧洲、亚洲、北美、澳洲、南美、美国多个主要大城市多地拥有自己的数据中心,共 107 个网络边际服务点(Edge Servers,即边缘服务器)提供服务。它可以加快将静态和动态 Web 内容(如 .html、.css、.js 和图像文件)分发到用户的速度,即当用户请求您用 CloudFront 提供的内容时,用户被路由到提供最低延迟 (时间延迟) 的边缘服务器,从而以尽可能最佳的性能传送内容。

资费

Amazon CloudFront 是亚马逊云计算服务的重要组成部分,其标准资费分为四部分:

  • 数据传出(互联网/源服务器):¥0.30866/GB(10TB 以内,用户请求边缘服务器和边缘服务器请求非 AWS 的源站都收费);
  • HTTP/HTTPS 请求:¥0.11/10000 次(HTTP),¥0.15/10000 次(HTTPS);
  • 失效请求:¥0.03355/条(指手动删除边缘服务器的缓存,前 1000 条免费);
  • 字段级加密请求:¥0.000013/10000 个请求;

其中,AWS 免费服务提供了一定额度的免费试用:

  • 50 1024 GB 数据传出;
  • 2,000,000 10,000,000 个 HTTP 或 HTTPS 请求;

Amazon CloudFront 详细定价参考:

对于 AWS Educate Starter Account,除本身免费项目,所有项目均收费。预估如下:

项目配置费用(月)
IP弹性 IP使用中免费
EC2t2.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 元,然后添加好友获取验证码,如已获得阅读权限请忽略本提示。

[wx]

部署

证书

CloudFront 支持 HTTP/HTTPS,如果要使用自己的域名,且想开启 HTTPS,则需要配置 SSL 证书。CloudFront 支持自定义证书和 Amazon CA 签发的可信任证书。

CloudFront 只支持部署在弗吉尼亚北部区域(us-east-1)的证书,因此需要注意导入或者申请证书时区域应切换到弗吉尼亚北部区域(us-east-1)。

导入证书

控制台导入

打开证书管理(AWS Certificate Manager),点击导入证书:

导入证书.png

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

证书内容.png

申请 Amazon 证书

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

打开证书管理,点击请求证书:

请求证书.png

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

公有证书.png

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

添加域名.png

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

验证域名.png

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

签发成功.png

Amazon 签发的证书只能在 AWS 中使用,不可导出。

分配

证书导入或申请好后,我们就可以开部署分配 CloudFront 了。

打开 CloudFront 管理界面,点击创建分配:

创建分配.png

分发方式选择 Web:

分发方式.png

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

源设置-01.png

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

源设置-02.png

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

源设置-03.png

注意:

1、对于不确定的设置项,可以点旁边的感叹号查看说明;
2、源站若启用 SSL,要让 CloudFront 也使用 https 访问源站,则源站 SSL 证书必须使用包含根证书的完整证书链,否则报 502 错误

稍等片刻,待分配状态变成已部署后,CloudFront CDN 就部署成功可以使用了。

已部署.png

解析

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

分配的域名.png

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

添加解析.png

然后我们就可以访问使用 CloudFront CDN 加速的网站了。

自选

CloudFront 和 CloudFlare 一样,接入之后可以自选优质 IP(连接相对更稳定、延迟相对更低、带宽相对更能跑满)。原理也是类似的:

  • 通过 NMAP 等工具扫描 CloudFront IP 段,批量测试 IP 的延迟和端口开放情况,选出最佳 IP;
  • 在 DNS 处删掉前面加的 CNAME 记录,直接通过 A 记录指定 IP,或者本地 hosts 指定。

如果觉得麻烦,可以直接使用现成的:获取可用 IP扫描结果

扫描脚本

脚本

#!/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

登录 AWS.png

点击 Account Details:

账户详细.png

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

Credentials.png

将密钥复制到本地:

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证书

[/wx]
ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 aws部署教程cdnamazoncloudflare经验方法自选websocketscloudfront 的文章

 本文最后更新于 2023/06/05 11:43:27,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 经验 > AWS CloudFront CDN 详细图文部署教程及优选自选优质 IP 方法

精选评论

  1. china2025vps
    china2025vps 回复

    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