现博客搭建见🔗
前言 #
最近又迭代了一下个人博客,作为一名程序员想从系统设计的角度来聊聊个人博客的搭建,聊一下我所遇到的问题,以及我自己在不同选择之间的权衡trade off。同时感觉这些问题也是程序员平时工作中所需要考虑到的问题。 因为对亚马逊云AWS比较了解,所以所选取的各种工具都来自于亚马逊云AWS。(本文会从价格方面来权衡各种工具,所有价格于2022年9月的价格)
需求Requirement #
首先从需求入手,对于个人博客我的需求是:
- 博客主要是用来发表文章,自我表达,除了用户评论,不涉及任何的用户交互比如注册登录等。
- 域名申请简单,便宜,而且可以自动续费。
- 需要有内容管理功能,轻松发文章,不想re-invent重新造轮子,希望可以简单实现各种各样的功能。
- TPS很小很小,一天最多只有1位数2位数的浏览量,所以根本不用考虑可扩展性scalability的问题。
- 想把各种多媒体文件存在云上,这样对机器硬盘要求不高而且不怕数据丢失。但也要备份backup和恢复restore的功能以免意外发生。
- 减少延迟,希望读者打开博客能很快的显示内容。
- 希望可以抵御一些常见的网络攻击。
- 想有一个Health Monitor监测网站是否在线,同时想有一个Performance Monitor监测网页的加载时间是否正常(尤其是在中国区加载时间),并且发现异常的时候有通知。
- 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插件免费提供暴力登录的保护。
垃圾评论 #
唯一的用户交互是评论,所以攻击者还有可能通过发垃圾评论对网站进行攻击。 Akismet Anti-Spam对个人网站免费提供垃圾评论过滤。 (现实是小破站还没有一条评论😭)
需求7 监控 #
监控网站是否在线 #
虽然有了一些保护措施,但还是难免网站掉线。 Jetpack免费提供网站监测,如果网站掉下了,会通过邮件通知。
监控网站加载速度 #
用户体验很重要,我的博客主要是中文为主,所以目标读者在中国。但是正如我前面所说,我的服务器和CDN都不在中国大陆,很想知道读者访问时加载的具体情况。(加载太慢很多读者会直接放弃) dotcom-tools这个网站可以手动选择不同地区来测试打开网站的速度,还可以知道具体每个文件的加载时间。 可惜的是这个网站提供不提供免费的自动监测,我自己也还没找到特别好的免费或者低价的监测工具。
需求8 SEO优化 #
虽然如今写博客有点自娱自乐的意思,但是还是希望有更多的用户可以看到自己写的文章,所以需要做好SEO,能让自己的博客在搜索引擎的搜索结果靠前。 每个搜索引擎都有自己的搜索资源平台,我现在做的只是在三家搜索引擎Google,Bing和百度提交了网站的sitemap.xml来指导搜索引擎爬取博客。
架构 #
详细讲下读者访问的数据流动: 当读者访问我的网站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里面读取返回。
结语 #
这次迭代博客,相当于做了一个小项目。虽然很多需求对于这样一个自我娱乐的东西来说不太有必要,但是在做的同时也增加了自己对网站建设的理解。 同时需要能帮助到有需要的朋友。 如果有问题可以留言,我会尽可能回答。