不到 3000 块钱,如何支撑起每月 500 万次访问量及 80TB 流量的网站?
文章转载自:http://www.myzaker.com/article/6274ed74b15ec05df9382ed2/
作者 | Greg Zaal 译者 | 弯月
出品 | CSDN(ID:CSDNnews)
长期以来,我们一直面临一个核心挑战:如何有效利用非常有限的捐赠资金,顺利运营一个高人气的网站及其静态资源。
将一堆文件直接扔到亚马逊的 S3 上当然非常容易,但我们根本承担不起如此高昂的费用。
单是利用 S3 提供 80TB 的流量,每月就需要花费 4 千美元,恰巧我们获得的捐赠资金大概也是这个数目。
就这一项,我们的预算就花了个干净,更不用说其他成本了。
那么,我们是如何以不到区区 400 美元的成本,支撑起每月拥有 500 万次访问量及 80TB 流量的网站呢?
为了通过经济实惠的渠道,轻松地支撑起我们的网站,我们找到了 Cloudflare。如果没有这个网络巨头,那么我们这一路会更加艰辛。
对我们来说,Cloudflare 是一个巨大的缓存层。
我们通过一组规则,定义了某些特定文件以及 URL 的缓存时间,如果是很少发生变更的文件,则可以长时间缓存,而对于每天都会变化的文件(例如我们的静态文件列表 ) ,则需要频繁更新。
每页加载页面时,浏览器会发送几十个请求,比如样式表、javascript、json 数据等等,但大多数都是静态文件。
Cloudflare 同样可以缓存这种流量,效果甚至比巨大的静态文件更好,最终的缓存率达到了 93%。
这极大地减轻了源服务器的压力,而相应的成本也会下降。
那么,这个强大的缓存层的成本又是多少呢?
每个月 40 美元。
在 Cloudflare 的帮助下,我们需要处理的流量已由原来的 80TB 降到了 15%。尽管如此,如果使用亚马逊 S3 服务的话,每月还是需要支出约 650 美元。
然而,S3 不是该领域唯一的玩家,还有很多其他更划算的提供商。
而我们的选择是 Backblaze,这也是一家为消费者提供备份服务的互联网巨头。
如果直接使用 Backblaze 的 B2 服务(亚马逊 S3 的同等服务),对于 Cloudflare 无法处理的最后 15% 的服务,每月将花费 130 美元。
但是,由于 Backblaze 和 Cloudflare 之间的合作关系,我们可以享用他们的 ” 带宽联盟 “。
也就是说,我们只需要支付存储费、部分上传费用和 API 请求,最后统计下来每个月大约 11 美元。
Web ” 服务器 “
通过上述一连串的操作,我们终于解决了托管静态文件本身的所有成本,但我们还需要一个网站来展示这些信息。
我们的网站 polyhaven.com 是用 Next.js 构建的( Next.js 是一个 javascript 框架,由 Vercel 创建。
虽然我们可以在自己的服务器或其他云提供商上运行 Next.js 应用程序,但 Vercel 提供了一项非常简洁的服务,而且价格合理,我们可以使用这项服务部署 Web 应用程序。
这不仅可以省去管理服务器的麻烦,而且无服务器的环境还有其他好处,比如提高世界各地用户的性能。
他们的基本费用是每月 20 美元,并根据使用情况收取额外费用。
由于我们已经使用了 Cloudflare,而且非常清楚哪些可以缓存,而哪些不行(比如需要用户身份验证的地方),所以一般我们都不会超出使用限制,除非出现严重错误。
事实上,最近我们获得了 Vercel 的赞助,所以我们无需承担任何费用。但本文仍然会将这笔费用计算在内。
以前,我们选择单独运行 hdrihaven.com 和其他站点,所有站点都建立在需要手动管理的 LAMP 技术栈上,性能问题的高发环节往往就是数据库。
为了避免将来出现这个问题,同时也不必再担心可靠性、性能、可扩展性以及完整性等问题,我们决定购买商业云解决方案:Google Firestore。
当然,这不是最便宜的选择,每月大约需要 100 美元,约占我们的网络预算的一半,但我仍然认为这是正确的选择。
Firestore 只收取超出免费使用的部分。对我们来说,主要是读取数据库。
每次从数据库中获取数据,我们都需要支付少量费用。其实,每次读取的成本非常小,大约为 0.0000006 美元。但是乘以每次页面浏览必须读取的文档数量(比如我们的库页面,每个静态文件都需要读取一次数据库,目前共计为 866 次),再乘以页面的浏览次数(每月约 500 万次),相应的成本会非常高昂。
为了最大程度地缓存数据库的读取,并避免 Vercel 的账单金额上涨,我们花费了 5 美元,单独搭建了一个服务器运行 API。
这个 API 的目标是将前端网站(托管在 Vercel 上)连接到我们的数据库。由于大量数据都被缓存了下来(为了降低数据库成本),因此这个 API 服务器可以说非常简单。
在未来很长一段时间内,这台服务器都可以支撑我们的需求,如果真到了无法支撑的那一天,我们也可以轻松地将服务器快照迁移到更强大的服务器,或者迁移到带有负载均衡的服务器网络中。
我们的数据库和 API 的成本如此之低(相对于不使用 Cloudflare 的成本),主要原因之一是缓存率极高,可达 93%。
Cloudflare 的缓存越多,我们的 API 从数据库读取数据的频率就越低,相应地成本也就越低。
Argo 是 Cloudflare 的一项可选服务,主要功能有两个:
1. 优化 DNS 路由,以改善延迟(有助于提升网站的速度)。
2. 向缓存添加一个额外的层,这样所有流量都会流经 Cloudflare 的几个最大的数据中心,再分散到数百个边缘节点。
我们对第二个功能非常感兴趣。
这可以提高缓存率(从 75% 上升至 93%),但需要付出代价:经由 Argo 网络的每 GB 流量都需要付费。
目前,Argo 每月的费用大约为 160 美元,是迄今为止最大的单笔费用。但请记住,它为我们节省了一大笔数据库费用,我大概算了一下,节省的成本大约为 250 美元。
此外,我们还可以享受降低延迟、降低 API 服务器负载以及减少 Vercel 的使用等优势。
最后,我们还需要考虑图像的问题。我们的网站上显示的所有图像(缩略图、渲染、预览等)都存储在 Bunny.net,这又是一笔 CDN 费用。
Bunny.net 不仅可以存储图像,而且他们还提供优化服务,允许我们动态调整网站的图像大小并动态压缩图像。这极大地改善了用户体验(页面的加载速度更快),以及我们的工作流程(我们只需要上传一个 PNG,而且格式和大小任意)。
根据流量大小,我们每月需要支付大约 27 美元的费用。
● DNS、缓存和出口:Cloudflare(2 个域),40 美元;
● 缓存:Cloudflare ( Argo ) ,160 美元;
● 静态文件存储:Backblaze B2,11 美元;
● 服务器托管:Vercel,20 美元;
● 数据库:Firestore,100 美元;
● API:Vultr,5 美元;
● 图片托管和优化:Bunny.net,27 美元;
● 域:Cloudflare,4 美元;
● 电子邮件费用:MXroute,3 美元。
总成本约 370 美元。
其中很多服务的收费都取决于实际的使用量,而实际的使用量又取决于网站的流量。这些成本可能会随着业务的发展而增长。
我们在构建基础设施时,特别注意模块化,因此我们不会过分依赖任何服务。如果有必要的话,甚至连 Cloudflare 也可以换掉。
目前,我们最薄弱的单点故障是 API 服务器,而且我没有任何运行公共 API 的经验。我们希望允许其他人使用我们的 API,并将我们的静态文件集成到他们的软件,因此这个领域需要进一步的研究和改进。
Google Firebase 很方便,但是很贵。我们希望将来研究一些其他的托管数据库。
Cloudflare + Backblaze 的带宽联盟是我们最大的节约成本的利器。如果将来失去这个优势,我们的计划是建立自己的负载均衡专用服务器网络。虽然听起来很困难,但我们有过这样的经验,而且效果很好。虽然需要在管理上花费一番心思,但成本应该不高。
希望本文分享的经验能对你有所启发,也希望你能找到理想的架构。
原文地址:https://blog.polyhaven.com/how-we-handle-80tb-and-5m-page-views-a-month-for-under-400/