关于在亚马逊网络服务 (AWS) 上创建应用程序的教程
亚马逊云服务 (AWS) 是全球最受欢迎的云计算平台之一。借助 AWS,您可以构建和运行应用程序,而无需购买物理服务器、设置服务器空间或维护自己的基础设施。本文将引导您使用一种常见方法在 AWS 上创建一个简单的应用程序:使用计算服务 (EC2) 部署Web 应用程序,并可选择使用托管数据库 (RDS),以及根据需要部署存储和域名。虽然以下示例具有通用性,但您可以将其应用于多种类型的应用程序。
-
1. 初步准备:会计和基本概念
开始之前,请确保您拥有一个 AWS 账户。许多 AWS 服务都提供免费套餐(在一定限制范围内免费),非常适合练习。
你需要理解的一些重要概念:
– 区域:AWS 数据中心位置(例如:Singapore/ap-southeast-1)。选择距离最近的区域可降低延迟。
– IAM(身份和访问管理):一种访问管理系统。最佳实践:不要将根账户用于日常工作。
– VPC(虚拟私有云):一个运行服务的虚拟网络。
– 安全组:“防火墙”,用于控制服务器的传入/传出访问。
理解了这四件事,你就能更容易地掌握 AWS 的基础知识。
-
2. 创建 IAM 用户并保护帐户
安全始终是我们的首要任务。请以 root 用户身份登录 AWS 控制台,然后:
1. 打开 IAM 服务。
2. 创建一个新用户(例如 `admin-dev`),并选中“向 AWS 管理控制台提供用户访问权限”。
3. 授予权限:练习时可以使用 AdministratorAccess(尽管在实际项目中应该更加严格地限制权限)。
4. 启用 MFA(多因素身份验证)以提高安全性。
完成后,从 root 用户注销,然后使用新创建的 IAM 用户登录。
-
3. 确定应用架构
在本教程中,我们将构建一个简单的架构:
– EC2:运行 Web 应用程序(例如 Node.js/Express、Python Flask 或 PHP)。
– 可选的 RDS:托管的 MySQL/PostgreSQL 数据库,以便整齐地存储数据。
– S3(可选):存储静态文件,例如图像、文档或备份。
– Route 53(可选):管理域。
– CloudWatch:基本监控。
如果你是新手,建议先专注于使用 EC2 来运行你的应用程序。
-
4. 创建 EC2 服务器
a) 创建实例
1. 登录 EC2 服务。
2. 点击启动实例。
3. 选择操作系统,例如 Ubuntu Server 22.04 LTS。
4. 选择实例类型:免费套餐使用 `t2.micro` 或 `t3.micro`(视情况而定)。
5. 创建或选择密钥对(例如,`aws-key.pem`)。请妥善保管`.pem`文件,因为它将用于SSH。
b) 网络和防火墙配置
– 确保实例位于默认 VPC 中(仅供练习)。
– 设置安全组:
– 仅允许从您的 IP 地址(例如“我的 IP”)通过 22 端口(SSH)进行连接
– 0.0.0.0/0(公共)的 80 端口(HTTP)
– 如果稍后使用 SSL,则端口 443 (HTTPS) 来自 `0.0.0.0/0`
注意:向公众开放 SSH 服务存在风险。务必限制 IP 地址。
点击“启动”,等待实例运行。
-
5. 通过 SSH 登录服务器
在 Windows 系统上,您可以使用 WSL 或 PuTTY。在 macOS/Linux 系统上,您可以直接在终端中操作。
1. 更改权限密钥:
“`重击
chmod 400 aws-key.pem
“`
2. 通过 SSH 连接到服务器(使用 EC2 的公网 IPv4 地址):
“`重击
ssh -i aws-key.pem ubuntu@PUBLIC_IP
“`
如果成功,您将连接到 AWS Ubuntu 服务器。
-
6. 安装 Web 服务器和应用程序运行时
这里举一个Node.js应用程序的例子,因为它被广泛用于现代Web开发。
a) 更新和安装依赖项
“`重击
sudo apt更新&& sudo apt升级-y
sudo apt install -y curl git
“`
b) 安装 Node.js(LTS 版本)
“`重击
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –
sudo apt install -y nodejs
节点-v
npm -v
“`
-
7. 创建一个简单的应用程序
创建项目文件夹:
“`重击
mkdir myapp && cd myapp
npm初始化-y
npm 安装快递
“`
创建 `index.js` 文件:
“`js
const express = require(“express”);
常量应用程序 = Express();
app.get(“/”, (req, res) => {
res.send(“您好!您的应用程序正在 AWS EC2 上运行。”);
});
app.listen(3000, () => console.log(“服务器正在端口 3000 上运行”));
“`
运行应用程序:
“`重击
节点index.js
“`
尝试通过浏览器访问:
– `http://PUBLIC_IP:3000`
但是,安全组中的 3000 端口目前未开放。您可以:
1)在安全组中打开端口 3000,或
2) 使用反向代理(更推荐),以便应用程序保留在内部端口上,但可以通过端口 80/443 访问。
-
8. 使用 Nginx 作为反向代理(通过 80 端口访问)
安装Nginx:
“`重击
sudo apt install -y nginx
sudo systemctl启用nginx
sudo systemctl启动nginx
“`
配置 Nginx:
“`重击
sudo nano /etc/nginx/sites-available/myapp
“`
配置内容:
“`nginx
服务器{
听80;
服务器名称 _;
位置/
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header 主机 $host;
proxy_cache_bypass $http_upgrade;
}
}
“`
启用配置:
“`重击
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
“`
现在访问:
– `http://PUBLIC_IP/`
该应用程序运行在 3000 端口,但公众通过 80 端口访问它。
-
9. 使用 PM2 持久运行应用程序
为防止 SSH 断开连接时应用程序崩溃,请使用 PM2:
“`重击
sudo npm install -g pm2
pm2 start index.js --name myapp
pm2 保存
pm2启动
“`
`pm2 startup` 命令会提供更多说明。运行显示的命令,即可让应用程序在服务器重启时自动运行。
-
10.(可选)使用 RDS 添加数据库
如果您的应用程序需要数据库,RDS 可以简化这一过程,因为 AWS 会管理备份、补丁和扩展。
简短步骤:
1. 打开 RDS 服务 → 创建数据库。
2. 选择 MySQL 或 PostgreSQL(某些配置可享受免费套餐规则)。
3. 设置用户名/密码。
4. 确保 RDS 实例与 EC2 实例位于同一个 VPC 中。
5. 将 RDS 安全组设置为仅接受来自 EC2 安全组的连接(不接受来自公共的连接)。
数据库启动后,获取 RDS 端点,并使用数据库驱动程序从您的应用程序连接到它。
-
11.(可选)启用带有 SSL 证书的 HTTPS
生产环境中必须使用 HTTPS。典型方法:
– 使用域名(例如,从 Route 53 或其他注册商处注册)。
– 在 EC2 上通过 Let's Encrypt (Certbot) 安装 SSL。
简而言之:
“`重击
sudo apt install -y certbot python3-certbot-nginx
sudo certbot –nginx
“`
按照向导选择域名并启用HTTPS重定向。
-
12. 监测和成本
AWS 提供 CloudWatch 来查看 CPU、网络和特定日志等指标。您还需要监控成本,以免错失良机。
重要提示:
– 在 CloudWatch 中启用计费警报(例如,如果费用超过 5 美元则发出警报)。
– 不使用时,请关闭实例。
– 删除未使用的资源(负载均衡器、EBS、弹性 IP、快照),因为它们可能仍然会产生费用。
-
关闭
恭喜!您已经掌握了使用 EC2 在 AWS 上构建应用程序、运行Web 应用程序、设置 Nginx 反向代理以及使用 PM2 实现始终在线的基础知识。您还了解了其他服务,例如用于数据库的 RDS、用于存储的 S3 以及用于安全的 HTTPS 证书。
如果你想升级,通常接下来的步骤是:
– 使用 CI/CD 实现自动化部署(GitHub Actions + SSH 或 AWS CodeDeploy),
– 使用 Docker 容器和 ECS 或 EKS 等编排工具,
– 使用 Lambda + API Gateway 的无服务器架构。
如果您愿意,请具体说明您正在构建的应用程序类型(Node.js、Laravel、Django、React 等)及其预期用途(演示、生产环境、大规模应用)。我可以根据具体步骤定制教程。