手把手教你在云上部署动态网站

部署一个典型的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

     

  • 打开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,并开启多可用区部署(创建备用实例)。

    手把手教你在云上部署动态网站
    手把手教你在云上部署动态网站
    手把手教你在云上部署动态网站

    存储保留默认设置即可。

    手把手教你在云上部署动态网站
    手把手教你在云上部署动态网站

    其余保留默认设置即可

  • 打开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加速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,我们实现了对网站的加速及安全加固。

现在就开始在亚马逊云上构建

无论您是在寻找计算能力、数据库、存储、内容分发、人工智能与机器学习,大数据分析还是其他功能,亚马逊云科技都有相应的服务来帮助您建立具有更高灵活性、可扩展性和可靠性的复杂应用。

企业出海或个人体验

超过200项服务
包含80余种产品免费试用

发展中国业务

近百项服务
包含宁夏区域20余种产品免费试用