本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建您的第一个 Node.js 堆栈
重要
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre
此示例介绍如何创建支持 Node.js 应用程序服务器的 Linux 堆栈以及如何部署简单的应用程序。堆栈包括以下组件:
-
包含两个实例的 Node.js App Server 层
-
一个 Elastic Load Balancing 负载均衡器,用于将流量分配给应用程序服务器实例
先决条件
本演练假定:
-
您拥有 AWS 账户,并且对如何使用 AWS OpsWorks 堆栈有基本的了解。
如果您不熟悉 AWS OpsWorks Stacks 或 AWS,请通过完成中的Chef 11 Linux 堆栈入门入门教程来学习基础知识。
-
您大致了解如何实施 Node.js 应用程序。
如果您是首次使用 Node.js,请完成介绍性教程 (例如 节点:启动并运行
) 以了解基础知识。 -
您已在 Amazon Web Services Region 中创建至少一个计划用于此示例的堆栈。
当您在某个区域中创建第一个堆栈时,Stac AWS OpsWorks ks 会为每种层类型创建一个亚马逊弹性计算云 (Amazon EC2) 安全组。您需要这些安全组来创建 Amazon RDS 数据库 (DB) 实例。如果您不熟悉 AWS OpsWorks Stacks,我们建议您在本示例中Chef 11 Linux 堆栈入门使用与学习教程时相同的区域。如果您想使用新区域,请在该区域中创建一个新堆栈;该堆栈不需要具有层或实例。创建堆栈后, AWS OpsWorks Stacks 会自动向该区域添加一组安全组。
-
您将在默认 VPC 中创建您的堆栈。
在本演练中,您可以使用 EC2-Classic,但有些细节会略有不同。例如,使用 EC2-Classic,您可以指定实例的可用区 (AZ),而不是其子网。
-
您的 IAM 用户拥有 AWS OpsWorks 堆栈的完全访问权限。
出于安全原因,强烈建议您不要在本演练中使用账户的根凭证。相反,创建一个拥有 AWS OpsWorks Stacks 完全访问权限的用户,然后在 Stacks 中使用这些证书。 AWS OpsWorks 有关更多信息,请参阅 创建 管理用户。
实施应用程序
本演练使用一个简单的 Express
要实施应用程序,请在工作站上的方便位置创建一个名为 nodedb
的目录,并向该目录添加以下三个文件。
程序包描述符
要创建应用程序的程序包描述符,请将一个名为 package.json
的包含以下内容的文件添加到 nodedb
目录。package.json
是 Express 应用程序必需的,并且必须位于应用程序的根目录中。
{
"name": "Nodejs-DB",
"description": "Node.js example application",
"version": "0.0.1",
"dependencies": {
"express": "*",
"ejs": "*",
"mysql": "*"
}
}
此 package.json
示例是相当少的。它定义所需的 name
和 version
属性并列出依赖程序包:
-
express
引用 Express程序包。 -
ejs
引用 EJS程序包,应用程序使用此程序包将文本插入 HTML 布局文件中。 -
mysql
引用 node-mysql程序包,应用程序使用此程序包连接到 RDS 实例。
有关程序包描述符文件的更多信息,请参阅 package.json
布局文件
要创建应用程序的布局文件,请将 views
目录添加到 nodedb
目录,然后将文件添加到一个名为 views
的包含以下内容的文件添加到 index.html
:
<!DOCTYPE html>
<html>
<head>
<title>AWS Opsworks Node.js Example</title>
</head>
<body>
<h1>AWS OpsWorks Node.js Example</h1>
<p>Amazon RDS Endpoint: <i><%= hostname %></i></p>
<p>User: <i><%= username %></i></p>
<p>Password: <i><%= password %></i></p>
<p>Port: <i><%= port %></i></p>
<p>Database: <i><%= database %></i></p>
<p>Connection: <%= connectionerror %></p>
<p>Databases: <%= databases %></p>
</body>
</html>
在本示例中,布局文件是一个简单的 HTML 文档,该文档将显示 Amazon RDS 中的某些数据。每个 <%= ... =>
元素均表示一个在应用程序的代码文件 (我们接下来将创建该文件) 中定义的变量的值。
代码文件
要创建应用程序的代码文件,请将 server.js
文件与以下内容一起添加到 nodedb
目录。
重要
使用 AWS OpsWorks Stacks,Node.js 应用程序的主代码文件必须命名server.js
并位于应用程序的根文件夹中。
var express = require('express');
var mysql = require('mysql');
var dbconfig = require('opsworks'); //[1] Include database connection data
var app = express();
var outputString = "";
app.engine('html', require('ejs').renderFile);
//[2] Get database connection data
app.locals.hostname = dbconfig.db['host'];
app.locals.username = dbconfig.db['username'];
app.locals.password = dbconfig.db['password'];
app.locals.port = dbconfig.db['port'];
app.locals.database = dbconfig.db['database'];
app.locals.connectionerror = 'successful';
app.locals.databases = '';
//[3] Connect to the Amazon RDS instance
var connection = mysql.createConnection({
host: dbconfig.db['host'],
user: dbconfig.db['username'],
password: dbconfig.db['password'],
port: dbconfig.db['port'],
database: dbconfig.db['database']
});
connection.connect(function(err)
{
if (err) {
app.locals.connectionerror = err.stack;
return;
}
});
// [4] Query the database
connection.query('SHOW DATABASES', function (err, results) {
if (err) {
app.locals.databases = err.stack;
}
if (results) {
for (var i in results) {
outputString = outputString + results[i].Database + ', ';
}
app.locals.databases = outputString.slice(0, outputString.length-2);
}
});
connection.end();
app.get('/', function(req, res) {
res.render('./index.html');
});
app.use(express.static('public'));
//[5] Listen for incoming requests
app.listen(process.env.PORT);
该示例显示数据库连接信息,还将查询数据库服务器并显示服务器的数据库。您可以根据需要轻松泛化它以便与数据库进行交互。以下说明是指上一代码中的已编号注释。
- [1] 包括数据库连接数据
-
此
require
语句包含数据库连接数据。如后所述,当您将数据库实例附加到应用程序时, AWS OpsWorks Stacks 会将连接数据放在名为的文件中opsworks.js
,该文件类似于以下内容:exports.db = { "host":"nodeexample.cdlqlk5uwd0k.us-west-2.rds.amazonaws.com", "database":"nodeexampledb", "port":3306, "username":"opsworksuser", "password":"
your_pwd
", "reconnect":true, "data_source_provider":"rds", "type":"mysql"}opsworks.js
位于应用程序的shared/config
目录中,即/srv/www/
。但是, AWS OpsWorks Stacks 在应用程序的根目录app_shortname
/shared/configopsworks.js
中放置了指向的符号链接,因此您只需使用即可包含该对象。require 'opsworks'
- [2] 获取数据库连接数据
-
这组语句通过以下方式显示
opsworks.js
的连接数据:将db
对象中的值分配给一组app.locals
属性(每个属性映射到index.html
文件中的一个 <%= ... %> 元素)。呈现的文档将 <%= ... %> 元素替换为对应的属性值。 - [3] 连接到 Amazon RDS 实例
-
该示例使用
node-mysql
访问数据库。为了连接到数据库,该示例会通过将连接数据传递到connection
来创建createConnection
对象,然后调用connection.connect
来建立连接。 - [4] 查询数据库
-
建立连接后,该示例会调用
connection.query
以查询数据库。此示例只查询服务器的数据库名称。query
返回一个results
对象数组(每个数据库对应一个该对象)以及分配给Database
属性的数据库名称。该示例将串联这些名称并将其分配给app.locals.databases,
,后者将在渲染的 HTML 页面中显示此列表。本示例包含五个数据库,一个是您在创建 RDS 实例时指定的
nodeexampledb
数据库,其他四个是由 Amazon RDS 自动创建的数据库。 - [5] 侦听传入请求
-
最后一个语句将侦听指定端口上的传入请求。您无需指定明确的端口值。将应用程序添加到堆栈时,需要指定该应用程序是支持 HTTP 还是 HTTPS 请求。 AWS OpsWorks 然后,Stacks 将
PORT
环境变量设置为 80 (HTTP) 或 443 (HTTPS),您就可以在应用程序中使用该变量。可以在其他端口上进行侦听,但是 Node.js App Server 层的内置安全组 AWS OpsWorks-nodejs-App-Server 仅允许进入端口 80、443 和 22 (SSH) 的入站用户流量。要允许流入其他端口的入站用户流量,请使用适当的入站规则创建安全组并将其分配给 Node.js App Server 层。请勿通过编辑内置安全组来修改入站规则。每次创建堆栈时,Stac AWS OpsWorks ks 都会使用标准设置覆盖内置安全组,因此您所做的任何更改都将丢失。
创建数据库服务器和负载均衡器
此示例使用 Amazon RDS 数据库服务器和 Elastic Load Balancing 负载均衡器实例。您必须先单独创建每个实例,然后将其合并到堆栈中。本部分介绍如何创建新的数据库和负载均衡器实例。相反,您可以使用现有实例,但建议您通读此过程以确保正确配置这些实例。
下面介绍了如何创建足够此示例使用的最低配置的 RDS 数据库实例。有关更多信息,请参阅 Amazon RDS 用户指南。
创建 RDS 数据库实例
-
打开 管理控制台。
打开 Amazon RDS 控制台,
并将区域设置为美国西部(俄勒冈州)。在导航窗格中,选择 RDS Dashboard,然后选择 Launch DB Instance。 -
指定数据库引擎。
选择 MySQL Community Edition 作为数据库引擎。
-
拒绝多可用区部署。
选择 No, this instance...,然后选择 Next。在此示例中,您不需要多可用区部署。
-
配置基本设置。
在 DB Instance Details 页面上,指定以下设置:
-
DB Instance Class:db.t2.micro
-
Multi-AZ Deployment:No
-
分配的存储空间:
5
GB -
数据库实例标识符:
nodeexample
-
主用户名:
opsworksuser
-
Master Password:所选密码
记录实例标识符、用户名和密码以供将来使用,接受其他选项的默认设置,然后选择 Next。
-
-
配置高级设置。
在 Configure Advanced Settings 页面上,指定以下设置:
-
数据库名称:
nodeexampledb
-
数据库安全组:AWS--db- Master OpsWorks- Server
注意
AWS-OpsWorks db-Master-Server 安全组只允许您的堆栈的实例访问数据库。如果您需要直接访问数据库,请使用适当的入站规则将其他安全组连接到 RDS 数据库实例。有关更多信息,请参阅 Amazon RDS 安全组。您也可以通过将实例放置到 VPC 中来控制访问。有关更多信息,请参阅 在 VPC 中运行堆栈。
记录数据库名称以供将来使用,接受其他设置的默认值,然后选择 Launch DB Instance。
-
以下过程介绍如何在此示例中创建 Elastic Load Balancing 负载均衡器。有关更多信息,请参阅 Elastic Load Balancing 用户指南。
创建负载均衡器
-
打开 Amazon EC2 控制台。
打开 Amazon EC2 控制台
,确保将该区域设置为美国西部(俄勒冈)。在导航窗格中,选择 Load Balancers,然后选择 Create Load Balancer。 -
定义负载均衡器。
在 Define Load Balancer 页面上,指定以下设置。
-
名称 –
Node-LB
-
创建内部 LB - My Default VPC
接受其他选项的默认设置,然后选择 Next。
-
-
分配安全组。
在 Assign Security Groups 页面上,指定以下组:
-
default VPC security group
-
AWS-nodej OpsWorks s-App-Server
选择下一步。在 Configure Security Settings 页面上,选择 Next。在此示例中,您不需要安全侦听器。
-
-
配置运行状况检查。
在配置运行状况检查页面上,将 Ping 路径设置为
/
并接受其他设置的默认值。选择下一步。在添加 EC2 实例页面上,选择下一步。在添加标签页面上,选择查看并创建。 AWS OpsWorks Stacks 负责向负载均衡器添加 EC2 实例的任务,此示例不需要标签。 -
创建负载均衡器。
在 Review 页面上,选择 Create 以创建您的负载均衡器。
创建堆栈
现在,您已拥有创建堆栈所需的所有组件。
要创建 堆栈,请执行以下操作:
-
登录 AWS OpsWorks Stacks 控制台。
登录 AWS OpsWorks Stacks 控制台
并选择 Add Stack (添加堆栈)。 -
创建堆栈。
要创建新的堆栈,请选择 Chef 11 stack,然后指定以下设置。
-
–
NodeStack
-
区域 - 美国西部(俄勒冈)
虽然您可在任何 Amazon Web Services Region 中创建堆栈,但在教程中,建议您在美国西部(俄勒冈州)中创建堆栈。
选择 Add Stack。有关堆栈配置设置的更多信息,请参阅创建新堆栈。
-
-
使用连接的负载均衡器添加 Node.js App Server 层。
在NodeStack页面上,选择添加图层,然后指定以下设置:
-
图层类型 — Node.js App Server
-
弹性负载均衡器 — Node-LB
接受其他设置的默认值,然后选择 Add Layer。
-
-
将实例添加到层并启动实例。
在导航窗格中,选择 Instances,然后将两个实例添加到 Rails App Server 层,如下所示。
-
在 Node.js App Server 下,选择添加实例。
将 Size 设置为 t2.micro,接受其他设置的默认值,然后选择 Add Instance。
-
选择 +Instance,然后将另一个 t2.micro 实例添加到其他子网中的层。
这会将实例放置在其他可用区 (AZ) 中。
-
选择 Add instance。
-
要启动两个实例,请选择 Start All Instances。
您已向此层分配 Elastic Load Balancing 负载均衡器。当实例进入或离开在线状态时, AWS OpsWorks Stacks 会自动向负载均衡器注册或注销该实例。
注意
对于生产堆栈,我们建议您将应用程序服务器实例分配到多个堆栈 AZs。如果用户无法连接到可用区,负载均衡器会将传入流量路由到剩余区域中的实例,并且您的站点将继续工作。
-
-
将 RDS 数据库实例注册到堆栈。
在导航窗格中,选择 Resources 并将 RDS 数据库实例注册到堆栈,如下所示。
-
选择 RDS 选项卡,然后选择 Show Unregistered RDS DB 实例。
-
选择 nodeexampledb 实例,然后指定以下设置:
-
用户 在创建实例时指定的主用户名;在此示例中为
opsworksuser
。 -
密码 - 创建实例时指定的主密码。
-
-
选择 注册到堆栈 以将 RDS 数据库实例作为 Amazon RDS 服务层添加到堆栈。
警告
AWS OpsWorks Stacks 不验证用户或密码值,它只是将它们传递给应用程序。如果您错误地输入这些值,您的应用程序将无法连接到数据库。
选择 注册到堆栈 以将 RDS 数据库实例作为 Amazon RDS 服务层添加到堆栈。
-
部署应用程序
您必须在远程存储库中存储应用程序。部署时, AWS OpsWorks Stacks 会将代码和相关文件从存储库部署到应用服务器实例。为方便起见,此示例将公有 Amazon Simple Storage Service (Amazon S3) 存档用作存储库,但您也可以使用多种其他存储库类型,包括 Git 和 Subversion。有关更多信息,请参阅 应用程序源。
部署 应用程序
-
将应用程序打包到存档文件中。
创建
.zip
目录和子目录的nodedb
存档,名为 nodedb.zip。您还可以使用其他类型的存档文件,包括 gzip、bzip2 和 tarball。请注意, AWS OpsWorks Stacks 不支持未压缩的压缩包。有关更多信息,请参阅 应用程序源。 -
将存档文件上传到 Amazon S3。
将
nodedb.zip
上传到 Amazon S3 存储桶,使该文件成为公有文件,然后复制文件的 URL 以供将来使用。有关如何创建存储桶和上传文件的更多信息,请转至 Amazon Simple Storage Service 入门指南。注意
AWS OpsWorks 堆栈也可以部署来自 Amazon S3 存储桶的私有文件,但为简单起见,此示例使用公共文件。有关更多信息,请参阅 应用程序源。
-
创建 AWS OpsWorks Stacks 应用程序。
返回 AWS OpsWorks Stacks 控制台,在导航窗格中选择 “应用程序”,然后选择 “添加应用程序”。指定以下设置:
-
名称 –
NodeDB
。该字符串是应用程序的显示名称。在大多数情况下,您需要应用程序的短名称, AWS OpsWorks Stacks通过将所有字符转换为小写并删除标点符号从显示名称生成该名称。在本示例中,短名称是
nodedb
。要验证应用程序的短名称,请在创建应用程序后,在 Apps 页上选择应用程序以显示其详细信息页面。 -
Type –
Node.js
。 -
Data source type -
RDS
。 -
Database instance - 选择之前注册的 Amazon RDS 数据库实例。
-
Database name - 指定您之前创建的数据库名称 (本示例中为
nodeexampledb
)。 -
Repository type -
Http Archive
。您必须对公有 Amazon S3 文件使用此存储库类型。
S3 Archive
类型仅用于私有存档。 -
Repository URL - 存档文件的 Amazon S3 URL。
对其余设置使用默认值,然后单击 Add App 创建应用程序。
-
-
部署应用程序。
转至 Apps 页面,然后在 NodeDB 应用程序的 Actions 列中,选择 deploy。然后选择 De ploy 将应用程序部署到服务器实例。 AWS OpsWorks Stacks 在每个实例上运行 Deploy 配方,从存储库下载应用程序并重新启动服务器。当每个实例均有一个绿色复选标记且 Status 为 successful 时,表示部署已完成,并且应用程序已准备好开始处理请求。
注意
如果部署失败,请选择 Log 列中的 show 以显示部署的 Chef 日志。错误信息显示在底部附近。
-
打开 应用程序。
要打开应用程序,请选择 Layers,再选择负载均衡器,然后选择负载均衡器的 DNS 名称,这会将 HTTP 请求发送到负载均衡器。您应看到类似于以下内容的信息。
注意
AWS OpsWorks Stacks 会在设置过程中自动将应用程序部署到新实例。仅联机实例需要手动部署。有关更多信息,请参阅 部署应用程序。有关部署的一般讨论 (包括一些更高级的部署策略),请参阅管理和部署应用程序和说明书。
接下来做什么?
重要
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre
本演练将指导您了解设置简单的 Node.js 应用程序服务器堆栈的基础知识。以下是有关后续操作的一些建议。
- 检查 Node.js 内置说明书
-
如果您想详细了解实例是如何配置的,请参阅该层的内置食谱 opsworks_nodejs
,其中包含 AWS OpsWorks Stacks用于安装和配置软件的配方和相关文件,以及内置的部署食谱,其中包含Stacks用于部署 应用程序的配方。 AWS OpsWorks - 自定义服务器配置
-
该示例堆栈是非常基本的堆栈。要在生产中使用,您可能需要自定义堆栈。有关更多信息,请参阅 自定义堆栈 AWS OpsWorks。
- 添加 SSL 支持
-
您可以为应用程序启用 SSL 支持,并在创建应用程序时向 AWS OpsWorks Stacks 提供相应的证书。 AWS OpsWorks 然后,堆栈将证书安装到相应的目录中。有关更多信息,请参阅 使用 SSL。
- 添加内存中数据缓存
-
生产级站点通常会通过在内存中的关键字/值存储 (如 Redis 或 Memcache) 中缓存数据来提高性能。你可以将两者与堆 AWS OpsWorks 栈堆叠一起使用。有关更多信息,请参阅ElastiCache Redis 和Memcached。
- 使用更高级的部署策略
-
该示例使用一个简单的应用程序部署战略,该战略将更新同时部署到每个实例。此方法简单快捷,但不允许犯错误。如果部署失败或更新存在任何问题,则可能影响生产堆栈中的每个实例,从而可能中断或禁用您的站点,直到您解决该问题。有关部署策略的更多信息,请参阅管理和部署应用程序和说明书。
- 扩展 Node.js App Server 层
-
您可以通过多种方式扩展层。例如,您可以实施配方以在实例上运行脚本,或实施 Chef 部署说明书以自定义应用程序部署。有关更多信息,请参阅 扩展层。
- 定义环境变量
-
您可以通过定义关联应用程序的环境变量来将数据传递到您的应用程序。部署应用程序时, AWS OpsWorks Stacks 会导出这些变量,以便您可以从应用程序访问它们。有关更多信息,请参阅 使用环境变量。