【发布时间】:2020-08-09 11:57:48
【问题描述】:
我了解 Nextjs 是一个需要服务器功能的 Node 框架,因此,将其用于服务器端渲染不能仅托管在 S3 上。 但是,这是否意味着唯一的选择是将整个应用程序托管在 EC2 上——这要贵得多——还是有其他中间解决方案?
【问题讨论】:
标签: reactjs amazon-web-services amazon-s3 amazon-ec2 next.js
我了解 Nextjs 是一个需要服务器功能的 Node 框架,因此,将其用于服务器端渲染不能仅托管在 S3 上。 但是,这是否意味着唯一的选择是将整个应用程序托管在 EC2 上——这要贵得多——还是有其他中间解决方案?
【问题讨论】:
标签: reactjs amazon-web-services amazon-s3 amazon-ec2 next.js
用于部署您的 Next.js SSR 应用程序,而不是遵循传统方法来管理和运行一个 24x7 全天候运行的整个 AWS EC2 实例。实际上还有一种更具成本效益和现代的方法,它使用 AWS lambda 和无服务器框架。
问。 AWS lambda 是什么?
AWS Lambda 让您无需预置或管理服务器即可运行代码。您只需为消耗的计算时间付费。
问。 Serverless framework 是什么?
Serverless Framework Open Source 让您可以使用无服务器架构开发应用程序,并使用 AWS Lambda、Azure Functions、Google CloudFunctions 等进行部署。
问。 Serverless-Next.js 是什么?
这是一个无服务器组件,专为部署 Next.js 应用程序而构建。此外,您在静态或公用文件夹中的任何资产都会上传到 S3 并自动从 CloudFront 提供,所以我认为这正是您要寻找的。p>
下面是解释它如何为用户提供应用程序的架构。
如果您是 Serverless 框架的新手,我建议您参加 Serverless 社区的免费课程 Serverless for Frontend Developers
编辑:2021 年 3 月 3 日
@super7egazi 在下面的评论中提出了真正的担忧。值得庆幸的是,有几种方法可以让 Lambda 函数保持温暖。这是向您的函数发送预定的 ping 事件以保持它们处于活动状态和空闲状态,准备好为请求提供服务的行为。
如果您只搜索“如何使 lambda 函数保持温暖?”,您会发现各种方法和插件来实现这一点。在谷歌上。
以下是我附上的一些链接以供参考。
How to keep your lambda functions warm?
【讨论】:
我们为此用例创建了一个开源 Terraform 模块,作为无服务器框架的低成本替代方案。我们不是仅依赖 Lambda@Edge 进行所有 SSR 操作,而是仅使用 Lambda@Edge 进行路由(作为某种反向代理),然后通过 API Gateway 在内部将请求重定向到区域 Lambda。
由于我们使用 CloudFront 作为反向代理,我们还可以针对 css、js 等的 _next/static/* 拆分大部分静态文件请求,并通过 S3 直接为它们提供服务,而完全不接触 Lambda@Edge 代理。
因此,每个请求的成本因路由而异:
静态资源请求:css、js、图片
仅适用于 CloudFront 和 S3(对于来自 CloudFront 的未命中)的费用
HTML 请求:预渲染的 HTML 路由或需要服务器端渲染 (SSR) 的路由
适用Cloudfront、Lambda@Edge(代理,以 1 毫秒为步长)的费用。
重写提供预渲染 HTML 的路由
S3 的费用适用。
使用服务器端渲染 (SSR) 的路由
适用HTTP API-Gateway 和regional Lambda(SSR,以 1 毫秒为步长)的费用。
使用此模型的几千个请求的总成本通常远低于 0.50 美元/月,同时拥有由 CloudFront 边缘缓存提供支持的快速服务站点。
在 GitHub 存储库上查找更多信息:https://github.com/dealmore/terraform-aws-next-js
【讨论】:
NextJS + Serverless 目前部署在不是免费的的 Lambda Edge 上。您不享受 Lambda(不是 Lambda@Edge)提供的免费套餐。
如果您的网站流量较低,我建议您使用 Vercel.com 进行部署,该网站在后端使用 Lambda(AWS 网络)。
*他们的爱好版本是免费的,并提供大量的免费流量和调用可比与 AWS Lambda 免费层。
NextJS 应用程序的部署就像上传到 Github + Vercel 与 GitHub 集成的自动部署一样简单。您无需担心 S3、托管或您的静态文件,一切都在您推送到 Github 的那一刻托管在 Vercel 上。你只需要专注于开发。
当您的需求上升时(您超越了 Hobby 包,并且超越了 Pro 包),那么在 Serverless@Edge 上进行部署变得更具成本效益。
到那时,您需要做的就是切换您的域。
无服务器是一个不错的概念,能够在各种平台上免费启动您的网站是一个优势。
但是,冷启动可能是一个大问题,因为有时需要 3-4 秒才能为访问者加载页面。
如果您正在执行静态或静态增量生成,这不是什么大问题。 这对 getServerSideProps 来说并不好。
如果您正在为冷启动而苦苦挣扎,请相信我并继续使用 VPS。 5 美元的 VPS 可以很好地运行一个网站。
【讨论】:
api 文件夹中的文件是否只是常规服务器端点(这是我希望的)到无服务器功能。
您可以使用 AWS Lightsail:https://aws.amazon.com/lightsail/
根据我使用nextjs 的经验,云功能不是部署大型应用程序的好地方,因此,这将是您的选择:
【讨论】:
不确定您是否需要在 Amazon 上托管,但您可以在 DigitalOcean 上以 5 美元/月的价格托管,或者您可以在 Heroku 的免费套餐上托管,直到您确定以后可以移到 Amazon转向更昂贵的解决方案和 EC2 主机:
我相信这对你来说应该是一个好的开始,然后再购买更昂贵的解决方案
您的问题的答案是,是的,如果您更喜欢在 Amazon 中更受管理的解决方案,EC2 对 Amazon 和 Elastic beanstalk 来说是最便宜的
【讨论】:
为了部署我们的 nextJs 网站,我们一直在使用 AWS lambda:https://github.com/serverless-nextjs/serverless-next.js 使用它非常简单。 不幸的是,有时页面的加载速度很慢。从2秒到7秒。 谷歌搜索控制台也证实了这一点。
我们找不到真正深入探讨这个问题的方法以及我们如何解决这个问题,但我怀疑这是一个冷启动。经过一番研究,AWS理论上是可以用并发来解决的:
但我无法让它工作,因为它是一个 Lambda@Edge,而且它也非常昂贵!
http://nachonacho.com 我们专注于 SEO,因此加载页面的时间是我们最关心的问题。
我们最终决定迁移到简单的 AWS EC2。
这里有比较:
【讨论】: