手把手教你在云上部署动态网站
部署一个典型的Web动态网站的全过程
前言
本教程中,我们将演示部署一个典型的Web动态网站的全过程,并采用多可用区部署的方式来提高网站的可靠性,该示例网站采用NodeJS及MySQL构建。此外,我们还借助Amazon CloudFront实现网站的加速及流量成本节省。在教程过程中,请注意控制台页面右上角的区域(Region)为同一个。
本手册所采用的架构如下:
可以看到这是一个典型的Web三层架构,包含负载均衡器,App服务器及数据库。在VPC中,NAT Gateway及ELB的节点处于公有子网,其余均放置在私有子网,提高系统的安全性。此外,Route 53可以托管并解析您的域名,CloudFront用来实现网站的静态内容及动态内容加速,也可以提高系统的安全性。
本教程包含如下步骤:网络规划及安全设置、数据库创建、服务器模板创建、负载均衡及自动伸缩配置,最后,通过配置Amazon CloudFront来实现网站内容加速。
关于本教程 | |
预计部署时间 | 10分钟 |
费用 | 低于 1 USD |
主题 | 部署动态网站 |
受众 | 全栈开发人员,前端开发人员,业务开发人员,开发运维工程师 |
级别 | 中级 |
相关产品 | Amazon RDS, Amazon CloudFront, Amazon VPC, Amazon EC2, Amazon ELB |
相关行业 | 通用 |
上次更新时间 | 2021年10月 |
操作指南
-
第一步 - 网络规划及安全设置
VPC是私有的专有网络,您可以通过VPC自有规划网络配置,如CIDR分配,子网划分,路由表设定等。通过安全组,您可以实现对进出网卡的流量的过滤。
1.1 创建VPC
这里我们会利用CloudFormation模板,来快速创建教程所需要的VPC资源,如上图所示,此VPC包括2个公有子网(共用一个路由表),2个私有子网(分别有一个路由表),2个NAT Gateway。
首先,打开CloudFormation控制台,选择创建堆栈。
URL填入: https://workshop-binc.s3.cn-northwest-1.amazonaws.com.cn/cfn/vpc-with-natgw.yaml
其余步骤使用默认值即可,并完成堆栈创建。稍等1-2分钟即可完成,但我们可以同时进行后续步骤。
1.2 创建安全组
接下来,进入 EC2 控制台的安全组界面 ,点击 创建安全组 。
分别为ELB,Bastion,AppServer及RDS创建安全组,并添加入站规则,具体如下:
- ELB
- 安全组名称: SG-ALB-HA-Workshop
- 描述: SG-ALB-HA-WorkshopVPC:
- 选择新创建好的VPC
- 协议:HTTP(80)
- 来源:0.0.0.0/0
剩余三个安全组的创建步骤类似。
- Bastion
- 安全组名称: SG-Bastion-HA-Workshop
- 描述: SG-Bastion-HA-Workshop
- VPC:选择新创建好的VPC
- 协议:SSH(22)
- 来源:0.0.0.0/0
- AppServer
- 安全组名称: SG-AppServer-HA-Workshop
- 描述: SG-AppServer-HA-Workshop
- VPC:选择新创建好的VPC
- 协议:自定义TCP(3000)
- 来源:SG-ELB-HA-Workshop的安全组ID
- RDS
- 安全组名称: SG-RDS-HA-Workshop
- 描述: SG-RDS-HA-Workshop
- VPC:选择新创建好的VPC
- 协议:MySQL/Aurora(3306)
- 来源:SG-ELB-AppServer-Workshop的安全组ID
- ELB
-
第二步 - 创建数据库
打开RDS数据库控制台 。
2.1 创建数据库子网组
接下来,先点击 添加与此 VPC 相关的所有子网,然后 删除 CIDR为 10.192.11.0/24 及 10.192.10.0/24 的公有子网,只保留两个私有子网即可。
2.2 新建数据库实例
这里我们创建一个RDS MySQL 5.7.31的数据库实例,实例类型选择db.t2.medium,并开启多可用区部署(创建备用实例)。
存储保留默认设置即可。
其余保留默认设置即可
-
第三步 - 创建AppServer模板
打开EC2控制台,并选择创建实例。
3.1 服务器配置
在VPC中创建一台EC2,除了以下各项外,均使用默认设置。
操作系统:Ubuntu Server 18.04. 直接搜索Ubuntu Server 18 或者 AMI ID: ami-0071f6f4df15863cc (北京); ami-0a22b8776bb32836b (宁夏)
实例类型: t3.small
VPC:选择新创建的VPC
子网:任意选择一个公有子网
安全组: SG-AppServer-HA-Workshop, SG-Bastion-HA-Workshop
3.2 安装软件及其依赖
关于如何连接到EC2实例的手册可以参考官方文档。
sudo apt update sudo apt install nodejs npm memcached -y # 下载并解压应用程序 wget https://workshop-binc.s3.cn-northwest-1.amazonaws.com.cn/code/workshop_ha.tgz tar -xf workshop_ha.tgz cd workshop_ha npm install sudo npm install -g sequelize-cli pm2
3.3 数据库初始化
修改配置文件~/workshop_ha/config/config.json
"development": { ... "host": "xxxxxx.xxxx.rds.cn-north-1.amazonaws.com.cn", // 修改为数据库endpoint "username": "your user name", // 数据库用户名 "password": "your password", // 数据库密码 ... }
执行如下命令创建schema:
sequelize-cli db:create sequelize-cli db:migrate
3.4 设置应用程序开机自启动
pm2 startup >> 输出如下: >> sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu # 执行输出的内容 sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu pm2 start app.js pm2 status # 确保状态为online
# 执行如下命令,确认应用程序有正常的返回 curl -I localhost:3000 >> HTTP/1.1 200 OK # 设置开机自启动 pm2 save
3.5 创建AMI镜像
回到EC2控制台,为这台EC2创建AMI镜像。
-
第四步 - 设置负载均衡及弹性伸缩
4.1 创建目标组
打开目标组控制台,点击 创建目标组。
其余保留默认值,然后点击【下一步】,点击【创建目标组】
4.2 创建启动模板
打开启动模板控制台 ,点击 创建启动模板。
选择一个密钥对,
4.3 创建AutoScalingGroup
打开 Auto Scaling 组 页面,点击 创建 Auto Scaling 组 。
其余步骤,均保持默认值,然后点击【跳至检查】,并完成创建。
4.4 创建负载均衡器
打开负载均衡器页面 ,点击 创建负载均衡器 。
跳过第二步;第三步,选择安全组:SG-ALB-HA-Workshop;第四步,选择现有目标组 TG-HA-Workshop;其余步骤保留默认值,完成创建。
稍等片刻,等待ALB的状态进入Active,复制DNS名称,ALB-HA-Workshop-xxxx.cn-north-1.elb.amazonaws.com.cn,在浏览器新标签页打开。
注意:DNS解析生效时间稍长,约5分钟左右,需耐心等待。正常情况下,可以进入如下页面,尝试刷新几次,可以观察到 az, instance_id 均会发生变化,表明流量通过ALB发送到了不同的后端EC2。
为了验证应用的健壮性,我们尝试将其中一台EC2做关机处理,模拟机器故障情况。
接下来,我们进入AutoScalingGroup页面,观察到如下活动历史记录,表明ASG探测到实例处于不健康状态,将其终止之后开启了一台新的实例。
稍等一会,实例通过目标组的健康检查之后,再次刷新网页,可以观察到新的实例已经投入使用。
-
第五步 - 配置CloudFront
在实际生产环境中,通常建议使用CloudFront来加速内容的访问、降低流量成本并提高安全性。接下来,我们给出了使用CloudFront加速ALB的配置过程。
5.1 创建CloudFront
如下图所示,只需要设置如下特殊标注的字段即可,其余设置可以保留默认值。其中,Forward Cookies和Query String Forwarding and Caching 可以根据自己的需要做调整。
查看创建完成的CloudFront详情,注意下CNAME status需要为Active状态,否则,需要先对您的域名进行ICP备案(仅中国区)。
5.2 添加域名解析记录
这一部分将我们网站的备用域名(CNAMEs)记录指向 CloudFront 分配的域名xxxx.cloudfront.cn(中国区),xxx.cloudfront.net (海外区)。
请注意:如果您是在海外区使用,且无需使用自定义域名,您可以直接通过cloudfront分配域名访问网站,而无需进行该步的配置;如果您是中国区使用,则需确保完成以下步骤,并确保域名经过备案。3.1 在Route 53里面选择“托管区域”,然后点击为该网站准备的域名
3.2 点击“创建记录”
填入内容如下(需根据您的实际情况调整内容)
创建完成后,显示如下:
3.3 等新增的DNS记录生效后,就可以通过在浏览器输入CNAME域名访问到我们所托管的网站了。
使用自定义域名进行访问:
为网站添加HTTPS支持
接下来,您可以为网站添加HTTPS支持,具体教程请参考:SSL/TLS证书申请及使用方法
-
小结
至此,我们完成了在AWS上部署自己动态网站的教程。通过本教程,我们学习到了如何通过设置自动伸缩,实现了机器数量随着请求数量的高低进行自动资源调配,且无需人工干预;此外,我们设计了严格的网络划分及安全组规则,只允许合法的流量访问EC2及数据库,提供了网站的安全性;最后,通过引入CloudFront,我们实现了对网站的加速及安全加固。