简介
Strapi是最受欢迎的开源无头CMS之一,在Github上有超过39k颗星星。目前,你必须在你的基础设施上托管Strapi,因为云版本还没有出现。好消息是,有很多选择。在这篇文章中,我将讨论在AWS上运行Strapi的生产。
Strapi文档已经有一个关于如何在AWS上托管它的深入教程。然而,这并不是生产级的,所以我将在这里介绍所缺的部分。
首先,让我们看看在生产中运行Strapi需要什么。
-
计算能力--你需要能运行我们的应用程序的东西,一台服务器。
-
数据库--Strapi将内容保存在一个SQL或NoSQL数据库中。
-
存储--你必须把媒体文件存储在某个地方。
-
监控--在生产环境中,收集和查看应用日志是至关重要的。
-
秘密管理--你需要处理访问密钥、密码等。
-
可扩展性--系统应易于扩展
1.计算能力
EC2
明显的解决方案是在AWS EC2实例上运行应用程序。t2.small是可以运行Strapi的最小的实例类型。
当你启动一个EC2实例时,你需要选择一个AMI。AMI是一个模板,包含操作系统和启动实例所需的软件。我建议使用亚马逊Linux 2,因为它可以很容易地与其他AWS服务整合。
另一个需要设置的重要事项是安全组,它就像一个防火墙,让你控制入站和出站流量。
注意,不要允许从任何地方进入SSH!SSH访问应该只允许来自你的内部安全网络。
一旦实例运行,你应该能够通过ssh访问它。Strapi是一个Node.js应用程序,你需要确保Node已经安装。不幸的是,Amazon Linux 2带有一个旧版本的Node,不被Strapi所支持。我建议使用NVM来管理不同版本的Node。
使用下面的片段,你可以安装最新版本的Node。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node
现在你有了NPM,你还应该安装PM2,这是一个进程管理器,可以帮助你管理你的应用程序。
如果你决定使用EC2实例,你也应该看一下保留实例 ,因为它们可以大大降低成本。
容器
另一个流行的解决方案是使用容器来运行Strapi。AWS有一堆用于管理和运行容器的服务。它们可以分为3类。
- 注册表。AWS ECR(Elastic Container Registry)--它帮助你管理和存储容器镜像。
- 调度。AWS ECS(Elastic Container Service)、AWS EKS(Elastic Kubernetes Service)--这些服务允许你配置容器应该如何运行。
- 计算。AWS Fargate、AWS EC2、AWS App Runner - 底层计算层。
谈到协调,在AWS ECS或AWS EKS之间的选择真的取决于你。如果你已经在使用Kubernetes,或者你喜欢它们提供的灵活性,EKS是适合你的工具。另一方面,ECS是由AWS主导的运行容器的解决方案,因此它更容易开始使用,它能更好地与其他AWS服务整合。
接下来,你需要决定在哪里运行你的容器。同样,这也是一个灵活性的问题。Fargate是一个无服务器的容器计算引擎。它很有用,因为你不需要像使用EC2时那样照顾底层环境。
我会使用ECS和Fargate,因为它们提供的简单性。
2.2.数据库
默认情况下,Strapi连接到一个SQLite数据库。由于这不适合生产,你需要在PostgreSQL、MySQL、MariaDB和MongoDB中选择。
注意,MongoDB在Strapi V4中不再被支持。
如果你愿意,你可以在EC2机器上部署你的数据库服务器,但我强烈建议使用AWS RDS,因为它消除了配置、扩展和备份数据库的复杂性。
在RDS上创建数据库是很简单的,但请记住,你应该只允许来自你的Strapi应用程序的流量连接到数据库。你将需要配置一个安全组规则,允许来自EC2安全组的入站流量。
Strapi将数据库配置文件保存在config/database.js 。如果你需要在开发和生产中拥有不同的配置,可以在每个环境下创建数据库配置。
config/env/{env_name}/database.js
3.存储
将资产存储到关系型数据库中,虽然可能,但不是一个好主意。对于管理媒体文件,Strapi正在使用上传提供者。默认提供者是将文件保存到本地目录下的 **./public/uploads**文件夹下。有很多供应商可用。
AWS S3是一个很好的存储文件的服务,并且有一个专门的提供者。你可以从npm安装它。
npm install strapi-provider-upload-aws-s3
我不喜欢这个插件的一点是,它添加了一个ACL规则,使S3桶可以公开访问。对于许多用户来说,这是不可以接受的,所以我做了一个分叉,删除了这个ACL规则。你可以在这里找到我的版本的提供者。
现在你需要允许你的应用程序写到S3桶。为此,我建议使用EC2的IAM角色。
4.监控
在生产环境中,监控你的应用程序和你的AWS资源是至关重要的。这可以通过AWS CloudWatch实现。
如果你在EC2机器或Docker容器上运行Strapi,你将需要安装CloudWatch代理。该代理将指标和日志发送到CloudWatch。在亚马逊Linux 2上,它可以作为一个软件包使用。
sudo yum install amazon-cloudwatch-agent
默认情况下,代理会向CloudWatch发送一系列的指标。我不会在这里介绍你如何配置代理,但下面的链接应该会有帮助。
5.秘密管理
将密码和配置保存在一个集中的地方,并从你的应用程序中安全地引用它们可能是很棘手的。正如你可能期望的那样,AWS有一个这方面的服务。系统管理器参数存储。参数存储是一个键值存储,你可以将密码、数据库字符串、访问密钥等以纯文本或加密的方式保存在这里。它与EC2和ECS都有整合。
让我们考虑一下数据库的配置文件。
// ./config/database.js
module.exports = ({ env }) => ({
defaultConnection: "default",
connections: {
default: {
connector: "bookshelf",
settings: {
client: "postgres",
host: env("DATABASE_HOST", "localhost"),
port: env.int("DATABASE_PORT", 5432),
database: env("DATABASE_NAME", "strapi"),
username: env("DATABASE_USERNAME", "postgres"),
password: env("DATABASE_PASSWORD", "secret"),
schema: env("DATABASE_SCHEMA", "public"),
},
options: {},
},
},
});
你可以把每一个参数,如DATABASE_HOST, DATABASE_PORT, DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_SCHEMA保存在参数存储中。使用AWS CLI,你可以像这样从Parameter Store获取参数。
aws ssm get-parameters \
--names "DATABASE_HOST" "DATABASE_PORT" "DATABASE_NAME" "DATABASE_USERNAME" "DATABASE_PASSWORD" "DATABASE_SCHEMA"
响应应该是这样的。
{
"Parameters": [
{
"Name": "DATABASE_HOST",
"Type": "String",
"Value": "localhost",
"Version": 1,
"LastModifiedDate": 1582154764.222,
"ARN": "arn:aws:ssm:us-east-1:111222333444:parameter/DATABASE_HOST"
"DataType": "text"
},
{
"Name": "DATABASE_PORT",
"Type": "String",
"Value": "5432",
"Version": 3,
"LastModifiedDate": 1582156117.545,
"ARN": "arn:aws:ssm:us-east-2:111222333444:parameter/DATABASE_PORT"
"DataType": "text"
},
.....
]
}
当我启动实例时,我通常运行一个微小的脚本,该脚本正在查询参数商店,解析JSON响应,并在我的.env.production 文件中导出参数作为环境变量。
6.6.可扩展性
通常情况下,每个AWS服务都能够在需要时进行扩展。这个基础设施唯一缺少的是应用前面的ALB(应用负载平衡器)。有多种原因说明ALB是有好处的。
- 把应用程序放在网络的边缘并不是好的做法。
- 你可以在需要时随时添加多个实例/容器。
- Strapi不支持HTTPS。
- 对蓝色/绿色部署是必要的
另外,当在EC2上运行你的应用程序时,你应该考虑使用EC2自动扩展组。一个自动缩放组由一个或多个EC2实例组成。你指定最小、最大和所需的实例数量。
首先,自动缩放组将启动1个实例,因为这是所需的数量。然后,如果出现峰值,它将启动更多的实例,但不超过3个。当需求下降时,它将终止不必要的实例,但将至少保留一个。
结论
在AWS上部署Strapi时,有很多决定要做。这可能有点让人不知所措,特别是如果你是AWS的新手。我希望这篇文章能作为一个起点,让你高屋建瓴地了解在AWS上运行Strapi的必要性。
The postRunning Strapi in production with AWSappeared first onLogRocket Blog.