作者:Larry

架构设计

WordPressWordPress 是一种用于构建博客和网站的 Web 发布平台。用户可以通过各种主题、扩展程序和插件对其进行自定义。

这个设计是基于AWS上的高可用架构:

  • 一个跨两个可用区的高度可用架构。
  • 一个根据 AWS 最佳实践配置有公共子网和专用子网的 Virtual Private Cloud (VPC)。这为您的部署提供了网络基础设施。
  • 一个用于提供互联网访问权限的互联网网关。堡垒主机使用此网关发送和接收流量。
  • 在公共子网中设置托管 NAT 网关,以允许对专用子网中的资源进行出站互联网访问。
  • 在公共子网内的 Auto Scaling 组中设置 Linux 堡垒主机,以允许对公共子网和专用子网中的 EC2 实例进行入站安全 Shell (SSH) 访问。
  • Elastic Load Balancing (ELB),用于跨多个 WordPress 实例分发 HTTP 和 HTTPS 请求。
  • 在专用子网中,配置在 Apache 上托管 WordPress 应用程序的 EC2 实例。这些实例在 Auto Scaling 组中配置,以确保高可用性。
  • 在专用子网中,配置由 Amazon Relational Database Service (Amazon RDS) 管理的 MySQL 数据库实例。
  • 在专用子网中配置 Amazon Elastic File System (Amazon EFS) 以跨 WordPress 实例共享资源(例如插件、主题和图像)。

前提:

这次试验假设我们已经创建了AWS账户,以及您拥有一个可用的域名。我们用美西区US-WEST-2。

创建VPC:

创建VPC,设置CIDR块为10.0.0.0/16,表示这个VPC可用IP范围为10.0.0.0-10.0.255.255 。

接下来按照下图示例在这个VPC里创建四个子网subnet

  1. Pub-Subnet-10.0.11.0/24
  2. Pub-Subnet-10.0.12.0/24
  3. Pri-Subnet-10.0.1.0/24
  4. Pir-Subnet-10.0.2.0/24

C:\0_Work\Projects\wordpressdemo\subnet.png

创建互联网网关:

此步创建一个互联网网关,然后将此网关Attach到你上文创建的VPC上。

创建NAT网关:

接下来创建NAT网关,选择一个公网子网。这个NAT网关是为了私有子网里的EC2访问互联网使用的。

C:\0_Work\Projects\wordpressdemo\NAT.png

在Apache服务器的子网里设置路由,将出口指向NAT Gateway:

创建安全组:

接下来为堡垒机,ELB,应用服务器apache+php,以及数据库创建四个安全组

Baston-Pub-SG:堡垒机安全组,开放ICMP和SSH协议端口。

wordpress-alb-sg:ELB使用的安全组,需要开放HTTP 80端口。

private-wordpress-web-sg:apache+PHP服务器的安全组,需要开放HTTP 80端口。打开了HTTP和ICMP,以及临时为堡垒机的IP打开SSH以便在服务器上做配置调测(后面正式发布后会关闭SSH)

PrivateDB-SG:RDS MySQL数据库安全组,需要为应用服务器的安全组(private-wordpress-web-sg)开放3306数据库端口

EFS-SG:efs文件服务使用的安全组,需要开放NFS协议给应用服务器的安全组(private-wordpress-web-sg)以及堡垒机的安全组‘Baston-Pub-SG ‘:

创建角色:

创建一个访问S3的角色‘wordpress-ec2-role‘,以便EC2访问S3:

创建RDS MySQL数据库:

  1. 这里选择多可用区部署,设置数据库名字‘wordpressdb’,以及主密码。安全组选择前面创建的‘PrivateDB-SG’安全组,子网选择上文创建的两个私有子网‘Pri-Subnet-10.0.1.0/24’ 以及‘Pir-Subnet-10.0.2.0/24’

通过堡垒机以管理员身份登录到数据库,做一下配置:

  1. 为您的 MySQL 数据库创建用户和密码。安装 WordPress 的过程将使用这些值与您的 MySQL 数据库通信。输入以下命令,以替换唯一的用户名和密码。

CREATE USER ‘wordpress-user’@’localhost’ IDENTIFIED BY ‘your_strong_password’;

  1. 创建数据库。为数据库提供一个有意义的描述性名称,例如 wordpress-db

CREATE DATABASE `wordpress-db`;

  1. 对您之前创建的 WordPress 用户授予您数据库的完全访问权限。

GRANT ALL PRIVILEGES ON `wordpress-db`.* TO “wordpress-user”@”%”;

  1. 刷新数据库权限以接受您的所有更改。

FLUSH PRIVILEGES;

  1. 退出 mysql 客户端。

创建EFS:

配置多个AZ的子网以及上文创建的efs安全组’EFS-SG’:

创建EC2启动配置:

这一步我们为wordpress web 服务器创建启动配置。

在EC2的配置详细信息一页,点开高级详细信息,在用户数据框,输入以下脚本

#!/bin/bash

yum update -y

#install apache, Apache 2.4.43 is the lastest AMS Linux2 AMI supported apache version
yum install httpd -y

#Install PHP 7.2
amazon-linux-extras install -y php7.2

#mount efs to EC2
service rpcbind restart
service nfs restart
yum install -y amazon-efs-utils
mkdir -p /var/www/html
chmod 775 /var/www/html
chown apache:apache /var/www/html

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-52904b57.efs.us-west-2.amazonaws.com:/ /var/www/html
echo “fs-52904b57.efs.us-west-2.amazonaws.com:/ /var/www/html nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport 0 0” >> /etc/fstab

#auto start service
chkconfig httpd on
chkconfig nfs on
service httpd restart

C:\0_Work\Projects\wordpressdemo\launch config3.png

在配置安全组一步,选择上文创建的安全组‘private-wordpress-web-sg ‘:

C:\0_Work\Projects\wordpressdemo\launch config2.png

选择你创建的启动配置,选择创建Auto Scaling Group ASG:

选择2个实例启动,选择上文创建的VPC,这里选择两个AZ的子网实现高可用。

C:\0_Work\Projects\wordpressdemo\Autoscaling1.png

为了实验,我们只需保持该自动扩展组大小为原始2个就可以。下一步配置通知,你可以创建一个SNS邮件通知,一旦EC2有重启等事件会自动通知到你,这里就不介绍了。

C:\0_Work\Projects\wordpressdemo\Autoscaling2.png

创建负载均衡器ALB:

接下来创建ALB负载均衡器,首先配置HTTP 80监听器

可用区选择本VPC下的两个公共子网(一定要是公共子网)

下一步安全组选择上文创建的‘wordpress-alb-sg ‘安全组,并且创建一个目标组。

接下来直接创建。

关联负载均衡和 ASG自动扩展组:

打开Auto Scaling 组,选择上文创建的ASG, 在操作里选编辑,然后填入上文创建的目标组,保存就可以了。

安装WordPress:

等待EC2启动后,准备通过EC2安装wordpress。我使用的是Amazon Linux2 AMI, 目前默认安装的php版本是5.4.16,所以如果你安装了wordpress较新的版本,会提示php版本不兼容。我们可以用下面命令下载一个和php5.4.16兼容的wordpress版本,通过堡垒机传给web EC2:

堡垒机上操作,下载wordpress,传给apache应用服务器:

cd .

wget https://cn.wordpress.org/wordpress-5.4.2-zh_CN.tar.gz

scp -i MyEC2Certs.pem ./wordpress-5.4.2-zh_CN.tar.gz ec2-user@10.0.1.142:/home/ec2-user/wordpress-5.4.2-zh_CN.tar.gz

ssh -i MyEC2Certs.pem ec2-user@10.0.1.142

通过堡垒机登录Apache 应用服务器,把wordpress解压到efs上:

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs- xxxxxxx.efs.us-west-2.amazonaws.com:/ /var/www/html

tar -xzf wordpress-5.4.2-zh_CN.tar.gz

cp -r wordpress/* /var/www/html/

rm -rf wordpress

rm -rf wordpress-5.4.2-zh_CN.tar.gz

接下来修改wordpress的配置文件,设置数据库连接:

将 wp-config-sample.php 文件复制为一个名为 wp-config.php 的文件。这样做会创建新的配置文件并将原先的示例配置文件原样保留作为备份。

[ec2-user ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php

用您喜欢的文本编辑器(例如 nano 或 vim)编辑 wp-config.php 文件并输入适用于您的安装的值。如果没有常用的文本编辑器,nano 比较适合初学者使用。

[ec2-user ~]$ vim wordpress/wp-config.php

查找定义 DB_NAME 的行并将 database_name_here 上文中创建的数据库名称。

define(‘DB_NAME’, ‘wordpress-db‘);

查找定义 DB_USER 的行并将 username_here 上文中创建的数据库用户。

define(‘DB_USER’, ‘wordpress-user‘);

查找定义 DB_PASSWORD 的行并将 password_here 上文中创建的强密码。

define(‘DB_PASSWORD’, ‘your_strong_password‘);

修复 Apache Web 服务器的文件权限

sudo chown -R apache /var/www

sudo chgrp -R apache /var/www

sudo chmod 2775 /var/www

sudo find /var/www -type d -exec sudo chmod 2775 {} \;

sudo find /var/www -type f -exec sudo chmod 0664 {} \;

sudo systemctl restart httpd

配置Route 53:

配置Route53,将域名解析到负载均衡器:

  1. 创建一个托管区域,域名是你拥有的公网域名。
  2. 然后选择创建一个记录集(RecordSet),选择别名alias,在别名目标里选择你的负载均衡器域名(选择你的负载均衡器,下方的描述里能找到这个DNS名称)

这样整个配置就结束了,如果每步都配置正确,你应该可以访问你创建的WordPress网站了。

By larryonaws

10多年大型企业软件研发管理经验,曾就职于爱立信、汤森路透、甲骨文、亚马逊AWS等公司。丰富的企业软件项目管理、架构设计、开发测试、交付运维、客户成功、大客户销售等职业经历。 有多年管理PeopleSoft/Fusion SaaS ERP套件研发工作的经历,对大型ERP软件有深刻的理解和丰富的经验。 AWS解决方案专业架构师,致力于推动AWS创新技术赋能企业软件的云转型。

发表评论

邮箱地址不会被公开。 必填项已用*标注