Skip to main content

【系统设计】用亚马逊云 AWS 和 Wordpress 搭建个人博客

· loading · loading ·
系统设计 SystemDesign 系统设计 SystemDesign
Jinbo Pan
Author
Jinbo Pan
A Life Explorer
Table of Contents
Warning! I have re-designed my website in 2024 and current website is not using wordpress anymore

现博客搭建见🔗

【系统设计】用亚马逊云 AWS Amplify/Hugo/Blowfish重搭个人博客
· loading · loading
系统设计 SystemDesign 系统设计 SystemDesign

前言
#

最近又迭代了一下个人博客,作为一名程序员想从系统设计的角度来聊聊个人博客的搭建,聊一下我所遇到的问题,以及我自己在不同选择之间的权衡 trade off。同时感觉这些问题也是程序员平时工作中所需要考虑到的问题。 因为对亚马逊云 AWS 比较了解,所以所选取的各种工具都来自于亚马逊云 AWS。(本文会从价格方面来权衡各种工具,所有价格于 2022 年 9 月的价格)

需求 Requirement
#

首先从需求入手,对于个人博客我的需求是:

  1. 博客主要是用来发表文章,自我表达,除了用户评论,不涉及任何的用户交互比如注册登录等。
  2. 域名申请简单,便宜,而且可以自动续费。
  3. 需要有内容管理功能,轻松发文章,不想 re-invent 重新造轮子,希望可以简单实现各种各样的功能。
  4. TPS 很小很小,一天最多只有 1 位数 2 位数的浏览量,所以根本不用考虑可扩展性 scalability 的问题。
  5. 想把各种多媒体文件存在云上,这样对机器硬盘要求不高而且不怕数据丢失。但也要备份 backup 和恢复 restore 的功能以免意外发生。
  6. 减少延迟,希望读者打开博客能很快的显示内容。
  7. 希望可以抵御一些常见的网络攻击。
  8. 想有一个 Health Monitor 监测网站是否在线,同时想有一个 Performance Monitor 监测网页的加载时间是否正常(尤其是在中国区加载时间),并且发现异常的时候有通知。
  9. SEO 有一些优化,这样搜索引擎可以搜到博客内容。

工具
#

需求 1 域名 AWS Route 53
#

个人博客需要一个域名,即访问一个博客大家在浏览器输入的网络地址名字。 亚马逊云的 AWS Route 53 提供域名注册,并且可以自动续费。 不同后缀的域名价格不一样,总体来说.com 域名是最便宜的,$12 一年。 要注意的是几乎所有的域名服务公司还会对 Hosted Zone 和 DNS 查询做额外收费。 Hosted Zone 是用来设置域名解析的,指定域名指向的 ip 地址,AWS Route 53 每个 Hosted Zone 一个月$0.50。 域名查询是将输入网址域名转换成 ip 地址进行访问,AWS Route 53 每百万查询收取$0.4。

需求 2 博客框架 Wordpress
#

首先排除用 React 等框架从头开始写,因为会花费很长的时间和精力。 考虑过静态博客框架 jekyll,hexo,Hugo,但是静态博客框架的 CMS(Content Management System) 内容管理系统不是很满意,没有很好的文字编辑软件,也不是很喜欢写一篇文章就要做一次 deployment 部署,所以就放弃了。个人觉得静态网站比较适合内容不需要经常改动的网站,比如文档网站。 动态博客框架有 Wordpress,typecho 和 ghost。其中 Wordpress 社区最大,对其他不同的工具兼容性最好,所以选择了 wordpress。 自己的写作流程是用 Ulysses App 写 Markdown 文档,然后 Ulysses 与 Wordpress 相连,直接发布在 Wordpress 网站上面。

需求 3 服务器 AWS Lightsail
#

由于 TPS 特别小,而且我也不会把多媒体文件存在服务器上面,所以我一个 1 CPU 1 GB 内存的主机足够了。 AWS Lightsail 可以理解为 AWS 云服务器的一个套餐,我选择的套餐$5一个月,有一个 1GB 内存,1 个 CPU,40GB SSD 硬盘的亚马逊云服务器 EC2,和 2TB 的数据传输。 感觉这个套餐已经很划算了。如果你用不到这么大的硬盘和数据传输,再便宜的话可以和 AWS EC2 签一个 3 年的先付费的合同购买 t3.micro 这款服务器,同样也是 1GB 内存,1 个 CPU,3 年一共$103,平摊到每个月只要$2.86。但这只是主机的价格,你还需要额外购买硬盘 SSD,SSD 每个月每 GB $0.08。同时传输数据也是额外的价格,$0.09 每 GB。这样假设用 5GB 硬盘,每个月传输数据 5GB,总花费也要$4.36。 AWS 可以在云服务器预装 wordpress,所以只要申请好云服务,选择有 wordpress 的操作系统,当云服务器启动后,wordpress 直接就可以用了。 Lightsail Pricing EC2 Pricing

需求 4 存储 AWS S3
#

所有的多媒体文件我都会存在 AWS S3 里面,这样我的主机就不会有任何的存储压力,只需要存文本文件。Wordpress 推荐WP Offload Media 这个插件,他会将上传的多媒体全部转存在 AWS S3 或者其它云存储,同时将博客文章对这些多媒体的引用地址直接改成云存储地址。 对于文本文件以及本地数据库的云端备份 Wordpress 可以使用Updraft Plus这个插件,提供一键云服务备份和恢复。 S3 每 GB 数据每月$0.023。 S3 Pricing

需求 5 CDN + 优化
#

AWS Cloudfront CDN
#

为了在全球各地都能更快地打开网站,我们需要用 CDN 来做不同区域的缓存。 注意的一点是,由于中国大陆网络的特殊性,使用大陆任何 CDN 服务都是需要备案的。 由于使用大陆 CDN 服务器可能比较麻烦,我选用了 AWS CloudFront CDN,因为有中国香港这个节点,所以想着大陆访问也不会太慢。同时用 AWS Lightsail 的话,直接一键生成,点几个按钮就好了。 申请了两个 CDN,其中一个media.panjinbo.com来缓存 S3 里面存储的多媒体,另一个www.panjinbo.com来缓存云主机动态生成的 html,css,js 等文件。 同时将自己的域名www.panjinbo.com直接绑定 CDN 地址,这样就不会有用户直接和服务器交流,所有流量都会到 CDN。 AWS CloudFront 每个月有免费的 1TB 数据输出,1000 万的数据请求。(这只是包含 CloudFront 传输到用户的数据,从你的服务器到 CloudFront 的数据应该是单独算的) 使用 AWS Lightsail 一键设置的 AWS Cloudfront 则是 1 年免费,第二年每月$2.5,包含了服务器到 CloudFront 50GB 的数据。 Lightsail Pricing

使用缓存
#

Wordpress 虽然是动态博客框架,但是对于常用的页面,可以先渲染好放在缓存,缓存的读取速度更快。

减少图片大小 WebP 格式
#

通常网络传输的瓶颈是图片等大体积多媒体,想要加载更快就应该减少这些多媒体的大小。 对于大小超过 2Mb 的图片推荐使用 WebP 格式,图片大小会减少很多,同时几乎所有的主流浏览器都支持。

使用HTTP/2协议
#

HTTP/2多路复用,使得传输更快。AWS Cloudfront CDN默认HTTP/2协议,只需要将云服务主机Wordpress设置成HTTP/2就可以了

需求 6 安全
#

AWS Shield 防 DDoS
#

使用 AWS Route 53,AWS Cloudfront 会自动免费增加 AWS Shield,这个服务主要是从网络层和传输层来防止 DDoS 攻击。 同时因为所有访问网站的流量都直接到 AWS Cloudfront,不会直接到服务器,所以云主机也不太容易被挂。

防止暴力登录
#

Wordpress 提供了很好的内容管理系统,但是同时也增加了一个新的问题就是管理者的验证,可能会有暴力登录的攻击。 Jetpack 插件免费提供暴力登录的保护。

wordpress-attack

垃圾评论
#

唯一的用户交互是评论,所以攻击者还有可能通过发垃圾评论对网站进行攻击。 Akismet Anti-Spam 对个人网站免费提供垃圾评论过滤。 (现实是小破站还没有一条评论😭)

需求 7 监控
#

监控网站是否在线
#

虽然有了一些保护措施,但还是难免网站掉线。 Jetpack 免费提供网站监测,如果网站掉下了,会通过邮件通知。

监控网站加载速度
#

用户体验很重要,我的博客主要是中文为主,所以目标读者在中国。但是正如我前面所说,我的服务器和 CDN 都不在中国大陆,很想知道读者访问时加载的具体情况。(加载太慢很多读者会直接放弃) dotcom-tools这个网站可以手动选择不同地区来测试打开网站的速度,还可以知道具体每个文件的加载时间。 可惜的是这个网站提供不提供免费的自动监测,我自己也还没找到特别好的免费或者低价的监测工具。

需求 8 SEO 优化
#

虽然如今写博客有点自娱自乐的意思,但是还是希望有更多的用户可以看到自己写的文章,所以需要做好 SEO,能让自己的博客在搜索引擎的搜索结果靠前。 每个搜索引擎都有自己的搜索资源平台,我现在做的只是在三家搜索引擎 Google,Bing 和百度提交了网站的 sitemap.xml 来指导搜索引擎爬取博客。

架构
#

wordpress-attack
详细讲下读者访问的数据流动: 当读者访问我的网站www.panjinbo.com的时候,首先会发请求到 AWS Route 53 DNS 服务去问这个网址对应的 ip 地址,然后 DNS 服务返回离读者位置最近的我的文本文件 CDN 的 ip 地址。然后读者会发请求到 CDN ip 拿取 HTML 文件,如果 CDN 有该文件同时没有过期,则立即返回给读者,如果 CDN 没有文件或者该文件已经过期,则 CDN 发请求到云服务器请求最新的 HTML,如果云服务器缓存里面有这个 HTML,则直接返回,如果没有则动态生成更新缓存返回。 当拿到 HTML 后,会提取需要的其他文件网址,如果是文本文件则网址还是www.panjinbo.com,那么直接重复上面的过程拿找 CDN 拿文件。 多媒体文件会在一个新的网址media.panjinbo.com,所以又得经过 DNS 拿到放多媒体文件的 CDN ip,然后请求多媒体。如果 CDN 有多媒体文件则直接返回,否则从 S3 里面读取返回。

结语
#

这次迭代博客,相当于做了一个小项目。虽然很多需求对于这样一个自我娱乐的东西来说不太有必要,但是在做的同时也增加了自己对网站建设的理解。 同时需要能帮助到有需要的朋友。 如果有问题可以留言,我会尽可能回答。