Posted on 周日 22 八月 2021

将博客通过S3静态网站托管发布,自定义域名


发布前准备

创建S3存储桶并配置

自定义域名的DNS配置

添加https与使用CDN


发布前准备

编辑pelicanconf.py:

SITEURL = 'hendiary.top'   #你的域名

RELATIVE_URLS = True

THEME = 'bricks'   #切换主题,可选,主题需要先安装,我的主题是bricks


主题可在pelican-themes获取

创建S3存储桶并配置

如果你还没有AWS账号,请先注册一个,然后了解下Amazon S3价格

创建存储桶

存储桶名字就是域名,比如我的是: hendiary.top

创建的时候,取消勾选“阻止所有公开访问”

创建并配置

配置属性

点击创建好的存储桶,点击属性,滑到最下面的静态网站托管,启用,索引文档填写index.html

属性

配置好后,在静态网站托管那块能看到访问网址,把它记下来。根据区域不同,网址可能有下面两种格式(参考S3 developer guide):

  • s3-website dash (-) Region ‐ http://bucket-name.s3-website-Region.amazonaws.com

  • s3-website dot (.) Region ‐ http://bucket-name.s3-website.Region.amazonaws.com


配置权限:Bucket Policy

去权限选项卡,编辑Bucket Policy,添加:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::hendiary.top/*"
        }
    ]
}


配置权限:ACL

还是权限选项卡,编辑ACL,配置为:

ACL

最后把博客下的outputs文件夹下的内容全部上传到存储桶,然后打开之前记下的网址就能看到首页了。

也可以用AWS CLI实现自动同步,就不用手动上传了。

自定义域名的DNS配置


配置DNS

域名需要去注册购买,也有免费的,注册购买过程不详述。我是在NameSilo购买的。

然后需要去DNS服务商添加DNS记录,对于S3静态网站来说,只提供了一个域名,没有ip地址,所以只能添加CNAME记录。

一开始我想用亚麻的Route 53,但提示一级域名(Zone Apex)不可以添加CNAME记录,各种查阅最后发现无解,只能添加二级域名比如www.hendiary.top这样。

后来我用了CloudFlare,就算不在它这买域名也能用它做DNS,还有免费套餐,很香。

一级域名添加CNAME记录它会有一条提示,会使用CNAME Flatterning,可以忽略。


2021-8-24更新:查到AWS官方文档说对于S3托管域名为Zone Apex的网站, Route 53可以添加特殊的别名记录



注册、选择套餐、添加要加速和保护的域名过程就不详述了,网上很多。这里记一下DNS记录的添加:

Type Name Value
CNAME @ bucket-name.s3-website-Region.amazonaws.com
CNAME www domain name


其中@代表根域,我的就是hendiary.top; 第二条的www指向hendiary.top

更改nameservers

DNS修改后,会提示需要到域名注册商那儿修改nameservers,即把默认的nameservers换成CloudFlare的。

我是在namesilo注册的域名,就到namesilo后台修改,删掉所有默认的,把CloudFlare提供的2个粘过去就可以了。

至此就全部完成了。需要注意的是DNS修改后,需要等一段时间才能生效。我的www这条记录就是第二天才生效的。

添加https与使用CDN

如果想要通过https访问网站,即在AWS中为S3托管站点添加SSL/TSL证书,就需要用到ACM (AWS Certificate Manager)和CF (AWS CloudFront Manager)。

在AWS Certificate Manager(ACM)申请证书

为自己的域名申请证书:Request a public certificate

比如我的:

hendiary.top, *.hendiary.top

注意:必须在“美国东部(弗吉尼亚北部)”区域申请,否则在CloudFront中无法使用。

选择验证方法:有DNS验证和邮件验证。邮件验证应该是需要DNS有MX记录,所以我选DNS验证;把AWS随机生成的Name和Value加入DNS服务商的DNS记录修改处,具体可以参考AWS页面上的指引。

在AWS CloudFront Manager(CF)建立分发(Distributions)

详细的请参考AWS CloudFront

Origin Domain Name填入托管成静态网站的S3存储桶的网站地址(endpoint url),即类似http://bucket-name.s3-website-Region.amazonaws.com

如果选择了S3存储桶的地址,网站打开会直接是一个xml文件,还有一个报错。

在Distribution Settings节中:

  • Alternate Domain Names(CNAMEs)里面填写要进行关联的域名,比如hendiary.top 以及 www.hendiary.top

  • SSL Certificate选择Custom SSL Certificate,然后在下拉框中选择之前在ACM申请的证书。

其他设置项默认即可,或根据需要设置。

CDN的设置:我用了默认的Use all edge locations (best performance),确实打开速度快了不少。

点击Create Distribution。需要一段时间才能完成配置,等待Status变成Deployed。 这时可以看到Domain Name列下面有一个"xxxxx.cloudfront.net",即Distribution domain name,这个地址下一步会用到。

修改DNS记录

去自己的DNS服务商的管理页面,进行DNS设定。

修改CNAME,将自己的域名比如hendiary.top的值设置成刚才记下来的"xxxxx.cloudfront.net"(之前应该是"bucket-name.s3-website-Region.amazonaws.com")

需要一点时间让所有设置生效。

之后就可以通过https访问网站了。