落格博客最早是运行在虚拟主机上的,只能通过面板操作,也没什么权限,使用起来非常别扭。再加上反正弄了服务器跑翻墙代理服务,那干脆就将博客搬迁到了 VPS 上。因此也就开始了我的 vps 折腾之旅。一转眼十年过去了,我后来也固定在 Vultr 的 VPS 上跑了 4 年。当然,这中间很多事情发生了,我做了 cnswift, 做了落格输入法,还有落格输入法的 macOS 版本……于是这个 20美元一个月的 vps 上边,除了要跑三个 wordpress 外,也开始陆续跑起了三个关于输入法的授权 API 服务。当然还有一个访问统计系统,一个 phpmyadmin 方便管理数据库——显然,还有一个为上述所有服务提供数据访问的 MySql 服务,对了,还有落格输入法的使用说明书这个静态网站。
在用命令维护服务器这么多年后,我早就对面板动了心……可以选择的面板很多,但很可惜,他们都不能和现有的配置相兼容——当然这也是可以理解的,毕竟现有的配置每个人都不同,位置、版本也千奇百怪就是了。于是我就一直也没机会体验。
后来知道了 AWS 进军虚拟主机市场,便宜的 Lightsail 理念很不错……经过测试,国内访问速度也还行,于是我决定把整个落格工作室的东西全都上云! (毕竟现在来说“云计算”也已经不再是新名词了,而我还在用虚拟私人服务器这种“传统”的东西……其实很容易单点故障对吧)
我做了一个整理:
- 我可以用一个 Lightsail 跑我的博客、工作室以及 Swift 编程语言翻译,这样开销是 $5/mo(最低有3.5的,我没选,下文详述);
- 输入法说明书的静态网站,可以丢到 S3 容器,开销大概是 $0.1/mo 可以忽略不计;
- 那些输入法的授权服务刚好是 Python 写的,可以无缝迁移到 Lambda 上,由于用量很小,开销同上,忽略不计;
- 而数据库,就可以分开,wordpress 的就在 Lightsail 上,不用额外花钱。因为我本身也不会存很大的数据,自带 40G 空间足够了。输入法的订单等数据存放在 DynamoDB,方便 Lambda 使用,由于数据量也很小,读写也不多,根本用不完免费额度。
这样,一旦完成迁移,我每月的固定开销就变成了 5 美元,但由于是云计算,所以稳定性和安全性都得到了提升,且后续开发维护都变得容易了很多。
难点
其实对于 aws 这样的云计算平台来说,技术没什么难度的。难的是去理解一些必要的概念。比如权限:由于 AWS 服务很多,不同服务之间的访问等都需要配置权限,他们有自己的一套配置模式 role。另外为了方便为外部服务授权,还有可配置的账号系统 AIM。
还有就是由于服务分的很细,有一些我们常用的功能可能有现成的工具批量自动化部署,而这个自动化部署的功能,又成了另一个服务,所以在你选择功能时,注意去看,不然很有可能你手动配置好了才发现原来有现成的方案。
静态网站
我第一个迁移的是静态网站,这个没什么好说的,GitHub 用 Actions 编译电子书,然后 push 到一个预先开启的 bucket 就可以了,bucket 我选在了香港区,国内直连速度也不错。然后我用 AWS CloudFront 自定义域名来为这个 bucket 做 cdn,这样就可以开启 https 了。
有个问题就是这样一来bucket 放在香港的优势就没有了。不过令人惊讶的是,cloudfront 的cdn在国内速度也很快,所以目前就这样好了。我把这个原因归结为 AWS 的 CloudFront 用的人不多,所以国内并没有被墙。(参考 Cloudflare,几乎大半的 IP 被屏蔽)
值得一提的是,其实可以不用 cdn,直接用 nginx 反向代理一下也是可以的,这样就也能提供 https 了。当然由于我这最先迁移的这个,当时没有想到这个方案。
落格博客
静态网站很简单,但 WordPress 就比较麻烦了。我首先想的是用本身就支持多站点的 WordPress,而且 Lightsail 是有这个 Application 可以直接部署的。但遗憾的是,多站点模式的配置比我预想的要复杂,几乎所有常用的插件都会针对多站点模式单独收费(往往单站点模式下是免费的)。于是我考虑另一种选项,我开三个小的 3.5美元的 Lightsail 如何?这样每月开销是 10.5 美元,也是可以接受的。
但直接运行 WordPress 也有它自己的问题,预置的这个配置也比我预想的要奇怪,配置文件很难找,都不是在标准的目录下。比如落格博客需要修改 nginx 配置来实现伪静态,需要使用 certbot 来实现自动 https 证书续签……但遗憾的是,这两样你都无法达成。
思前想后,既然心水面板很久了,不如就试试?
最后的实现是用 $5/mo 的 Plesk 面板 Application。方便快捷!
由于 Plesk 本身性能需求,3.5 价位的 Lightsail 无法支持 Plesk。
我砍掉了访问统计系统,改用 WordPress 插件 WP Statistics, 而 phpmyadmin plesk 也自带了。另外这个选项还内置了一个 Plesk 的基础授权,最多支持 3 个域名,我只有两个,如果子域也算上,也就三个,足够了。就这样在 plesk 上创建网站,添加数据库,然后 WordPress 目录打包迁移。匹配数据库账号密码后,就迁移成功了。由于我的博客启用了伪静态,所以还需要单独配置一下伪静态,最后再到“固定链接”那里点一下保存配置,刷新 rewrite 规则即可。
cnswift.org
这个没有伪静态,多以比落格博客要简单一些,就不再多说了。
落格工作室
落格工作室实际上是 logcg.com 的一个子域名,好在 plesk 支持创建子站点,子站点默认会使用和主站点相同的数据库账户,但数据目录是分开的。我们可以在 plesk 上手动创建一个数据库关联给子站点,这样就各自独立了。但网站目录还是会在同一个父目录下就是了。
缓存
如果你使用了比如 WP Super Cache 这类插件,那么迁移之前最好先删除全部缓存然后把他们关掉。首先缓存文件很多的话会占用空间,压缩、解压缩都需要时间,上传下载也是一样。另外由于网站目录的绝对路径有了变化,会导致默认的缓存文件找不到,然后导致网站崩溃……这下就很难办了,因为你根本不知道问题出在哪里。
CDN
我尝试用 CloudFront 为 WordPress 做整站 cname cdn,但很遗憾,这样会导致 WordPress 自己困惑,从而发生重定向环路。要么是 https 访问 cdn, cdn http 回源被再次重定向到 https 循环,要么就是 域名不同导致的环路。总之,最终我还是用传统办法,只替换静态文件的域名来实现静态文件 cdn了。
有一个问题是当 cdn 缓存字体时,总是会有报错无法命中,需要在 nginx 中添加额外规则:
1 2 3 |
location ~ .(ttf|ttc|otf|eot|woff|woff2|font.css)$ { add_header Access-Control-Allow-Origin "*"; } |
证书授权服务
这个比较麻烦,好在都是 Python,我首先是想用 lambda 实现,但后来发现原来有个组合服务叫 CloudFormation,配合 AWS 自己的工具 SAM,就可以用描述文件一次性自动化部署 lambda+api gateway+lambda 了。
这里我遇到一个难题是怎么才能让现有服务无缝衔接过去,不同于 web 端,用户只要刷新了就是新版,落格输入法这种软件是需要用户去更新的,战线会拖得很长……感谢早年时候与墙奋斗,借着当年反代 Google 的经验,我用现有域名反代了我的 Lambda API,这样这些服务的接口迁移对客户端来说就是完全无缝的了!
有一点,在反代时,注意这一条设定:
1 |
proxy_set_header Host $proxy_host; |
不能是 $host 。
总结
其实使用 Lightsail 便宜的原因是他把 CPU 拆分为“算力”来卖了,平时我们租一个 VPS, CPU 是按照速度和核心算钱的,但并不是每一个服务总能跑满 CPU 的所有核心的,相反,大多数情况下,CPU 可能都处在20%左右的工作状态。这样一来绝大部分计算量就被浪费了。而 Lightsail 则引入了固定算力和突发算力,平时服务器稳定运行,会在固定分配的算力区间,也就是 CPU 占用量的 10%。如果遇到突发比如插件升级,浏览量突然增多,那 CPU 的占用量也可以飙升到 100% 甚至 140%,此时会消耗你的突发点数。这个点数会在平时不用突发算力时自动增长。(当然,如果点数用完了,那CPU的性能会给你固定到 10%,此时服务器就运行缓慢了。显然,这也说明这个配置对你当前的状态有点低了。)
另外 Lightsail 由于已经过于精简(都已经在按 CPU 算力卖钱了),它不支持动态扩容,不过好在支持每日自动快照,所以 AWS 官方也推荐需要扩容时直接创建快照,然后购买高级版本,再恢复快照。反正静态 IP 地址是单独的另一个服务,你只需要将旧的服务器上的 IP 地址附加给新的服务器,就完成了扩容。
不要忘了同步你的防火墙配置,而且 IPv6 地址会变,记得更新域名解析记录。
另,由于有了快照功能,也就不需要再用复杂的 WordPress 备份插件来每周备份整站数据到 Dropbox 啦~
本文由 落格博客 原创撰写:落格博客 » 落格博客 AWS 上云踩坑记
转载请保留出处和原文链接:https://www.logcg.com/archives/3803.html
现在好了,腾讯云、阿里云取代了过去的大部分IDC