发了个帖子 抱怨服务器一大堆却没个放自己个人站的地儿。其实是服务器都是生产环境要跑各种业务,不能放自己的东西。其实个人站就一个博客一个知识库,还都是静态的,连买个 Linode 都觉得资源浪费。放在 GCE f1.micro 上吧,是便宜了不过网络抽死。如果不是因为要用 SSL 防运营商劫持和中间人攻击,真的直接扔 GitHub 了。
感谢 @sparanoid 的建议,花了一下午尝试将自己的静态网站部署在 AWS 云上。
创建一个 S3 文件桶,并在「属性」 -> 「静态网站托管」页选择「启用网站托管」,然后索引文件填写 index.html
。
在此页面会得到一个网站终端节点,例如 example.com.s3-website-ap-northeast-1.amazonaws.com
这样。先复制备用。
其实之前签发了一张三年的 ShinoSaki ECC 证书,然而 AWS 不认(ノ=Д=)ノ┻━┻ 只好去签了 AlphaSSL 的泛域名。
需要安装 awscli ,可以直接 sudo pip install awscli
。
上传证书命令如下(示例名称记得改成自己的哦)
aws iam upload-server-certificate --server-certificate-name cert-name --certificate-body file://example_com.pem --private-key file://example_com.key --certificate-chain file://ca.pem --path /cloudfront/yoursite/
前面的 file://
也不能移去,否则会报错 A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.
如果是 Jekyll 一类会创建「文件名.html」的程序, origin
直接下拉菜单中选择 S3 的文件桶地址即可。但是 Hexo 和 MinoriWiki 都是目录名下的 index.html
,所以只能使用之前得到的网站终端节点。填入地址后,下面的配置随自己的想法选择即可。 Alternate Domain Names (CNAMEs)
填写自己的域名,然后下面的 SSL 选择 Custom SSL Certificate (example.com)
和一个对应的证书。 Default Root Object
填写 index.html
。
为什么只能使用网站终端节点而不是 S3 地址的原因是 CloudFront 和 S3 的 Default Root Object 工作原理不同,如果是请求子目录,那么 CloudFront 不会给默认加上 index.html
导致 403。
创建之后 CloudFront 需要(很长一段)时间来部署。于是先把分配的 CDN 地址 xxxxxxxxxxxxx.cloudfront.net.
复制备用。
建立一个 Route53 Hosted Zone,然后导入以前的 zonefile 或者什么的。网站的地址 Type 选择 A - IPv4 address
,然后 Alias 选择 Yes
。Alias Target 是刚才复制的 CloudFront 的 CDN 地址。Routing Policy 选择 Simple
——GeoDNS 将交由 CloudFront 完成。
Hexo 已经有了现成的 S3 deployer,不过主页上的那个不工作也不管别人给提交的 PR。所以推荐使用 hexo-deployer-aws-s3 。
不过貌似是会强制覆盖每个文件的,上传花了好久啊比 Git 慢多了… S3 啥时候支持 Git (ノ=Д=)ノ┻━┻
MinoriWiki 从一开始就是面向 UNIX 系使用者的一套超简单个人知识库,所以压根没考虑用 S3 啊(ノ=Д=)ノ┻━┻
不过自己写的东西好处就是可以各种改(死)所以半个下午发布了一个带有 S3 支持的新版。使用了 node-s3-client 库,可以只上传修改了的文件。
一路搞下来,CloudFront 也就差不多了,域名解析应该也更新了。试试看效果吧~
没啥访问量的个人站,用 Route53 + S3 + CloudFront 的开支一个月可以控制在 2 美元左右,但是性能、网络和可用性远远比一个月 2 美元的 VPS 好得多。
然而在国内… AWS 被滥用还是挺凶的。所以各种服务被干扰,于是成了现在这惨样。