本文介绍如何基于各种云服务优雅且低成本地搭建个人网站,涉及的云产品有云服务器、SSL、企业邮箱、对象存储、CDN、云函数、API网关、云监控等。
概述
如今云服务提供商们提供了大量涵盖计算、网络、存储等方面的云服务,其中一些云产品功能强大,如果能善加利用可以大幅降低开发和运维的成本。下面以基于腾讯云搭建的个人网站为例,对网站整体的架构进行介绍。
网站目前的主要功能是个人博客,后续可以扩展如个人网盘等其他应用。当前架构图如下:
一、基础设施
1.云服务器CVM
云服务器使用的是CVM,1核2G,下行带宽1Mbps,这个配置用来搭建起步阶段的个人博客是完全够用了,购买学生机或者在活动时购买价格也比较便宜。
有了服务器资源就可以开始博客搭建,我选的博客系统是极简主义的Typecho,安装过程可以参考这篇博文,主要是在服务器上安装nginx、mysql、php以及typecho的源码。
2.域名
注册 - 备案 - 解析
服务器创建后同时会分配一个公网ip,但是为了便于分享和传播,建议进行域名注册。注册后需要进行备案,现在的备案流程也已经简化为在小程序上操作,省去了原有的幕布拍照环节,前后大概1-2周时间就可以完成备案。之后在控制台进行域名解析,即绑定域名和服务器ip,注意对带或不带www前缀的域名都要进行解析,完成解析后就可以在浏览器通过域名来访问网页了。
主域名的确定
为了便于SEO,建议根据个人喜好确定一个主域名,因为搜索引擎对于带www和不带www前缀的地址是当成两个网站分开计算权重的。国内网站一般带www,而国外网站(如github、stackoverflow、leetcode)等是不带www的。我这里是选择不带www的地址(zhayujie.com),并在nginx中配置对带www的访问301重定向到不带www上,以集中权重。
企业邮箱
拥有域名后,还可以注册以自己域名为后缀的企业邮箱,基础版免费使用且账号数量无上限,再也不用担心邮箱号不够用了(如微信公众平台注册),邮箱格式类似于 [email protected]
。
3.全站HTTPS
为了网站安全以及利于SEO,建议支持https协议访问网站。可以申请免费的SSL证书,将证书和私钥放置到服务器,并在nginx中开启并配置SSL。同样为了避免分散权重,可以把http访问的请求301重定向到https上。以我的网站为例,带不带www以及是否使用https都会统一访问https://zhayujie.com/。
二、基于COS和CDN的图床
1.对象存储COS
由于服务器下行带宽有限,如果图片存储于我们自己的服务器,出现并发访问时可能导致带宽超限,访问速度下降。所以可以把图片存储到 COS(Cloud Object Storage)中,搭建自己的图床,这样当博客同步到其他博客平台时,也便于对图片资源进行统一管理。
COS的使用比较简单,类似于网盘,在存储桶中可以建立树状目录结构,每个存储桶(bucket)会分配一个公网域名,其下的文件通过https://{bucket}/{dir}/{filename}
的形式进行访问。但在博客中直接使用该链接是不妥的,因为一旦我们迁移到其他云服务商或者切换其他的存储方式了,原有的链接就失效了,一一修改成本太高。好在cos支持配置自定义域名,可以通过类似http://{domain}/{dir}/{filename}
的地址进行访问。
2.内容分发网络CDN
COS的自定义源站域名不支持https访问,为了不影响我们的全站https,并且同时提升访问速度和减少流量成本,可以配合CDN服务,开启自定义CDN加速域名,具体步骤见文档。
可以选取一个子域名作为cdn自定义域名,添加CNAME解析,这样通过自定义域名会首先访问cdn边缘服务器,如果未命中则回源到cos。例如上面的图片我配置的地址是https://blog.cos.zhayujie.com/web/blog-cloud-arch.jpg。
三、基于Serverless的消息服务
1.云函数SCF
在博客开发过程中会遇到一些发送消息的功能,比如读者回复文章时给笔者发送通知,笔者回复评论时给读者发送通知,博文发布时给订阅的读者发送通知等等。这种消息通知的功能是很适合单独拆分出来形成一个消息服务的,如果写在博客源码中则复用性差(网站下其他应用要发送消息时需要重写),而单独部署服务又会增加运维的成本(如果服务挂掉怎么办),这时候可以考虑serverless(无服务器)的架构,仅将我们的核心代码片段托管给云服务商。
腾讯云提供了云函数SCF(Serverless Cloud Function),是一种FaaS技术。对于消息通知这种异步、无状态的功能,很适合使用云函数编写,比如接收到请求后向指定接收人发送一封邮件。
2.API网关
云函数的触发方式有多种,最常用的有定时任务和API网关。由于消息通知是通过事件触发而不是定时触发,所以选择API网关,创建了触发器后便可从公网直接访问该函数,与Nginx反向代理的作用类似。
API网关的域名是随机生成的,不利于对未来变化的扩展,故同样绑定自定义域名,使用https://{domain}/{function}
形式的地址触发函数。例如我的邮件发送函数地址配置为https://apigw.zhayujie.com/commentNotice
,在业务代码中只需向该地址发送POST请求即可触发邮件投递。
四、监控、快照和统计
1.监控告警
服务器的监控和告警同样很重要,有助于我们及时发现并排查问题。监控部分一般直接在控制台的 云服务器 - 实例 - 监控 中进行查看,有对不同时间周期和时间粒度下的CPU、内存、带宽、磁盘等的详细数据。
告警部分则在云监控中配置,可以配置多种报警策略如对cpu、内存、带宽等指标超出阈值后进行告警,以及一些机器故障事件(如ping不可达、机器重启等)。对COS的报警同样可以在此配置。告警渠道可以是微信、邮件和短信。
2.快照
为了防止服务器硬盘中的数据遭到攻击或被误删,可以在 云服务器 - 快照 控制台中设置进行快照备份,并且支持定期快照策略,设置每隔一段时间自动创建新的快照。
3.访问统计
对网站的访问情况进行统计分析有利于我们优化网站内容和体验。对于访问数据统计使用的是百度统计,使用埋点方式接入,可以查看每一个访客的地域,来源,搜索词,转化等信息,统计访问量趋势。
对于搜索引擎工具使用的是百度站长工具,用于提交页面收录,查看索引量、抓取频次等数据。
总结
以上就是一个功能齐全的个人博客的搭建过程,大致计算一下成本,云服务器活动期购买一百一年,域名一般几十块一个,而COS、CDN、SCF等产品都有大量的免费额度,且在建站初期流量费用同样是微乎其微,所以总体算下来成本是极低的。个人开发者可以把个人网站当做一个产品来做,思考如何利用好公有云的各种云产品资源来提升用户体验,提高开发效率,降低运维成本。
原文链接:https://zhayujie.com/blog-cloud-arch.html