作者: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
- Pub-Subnet-10.0.11.0/24
- Pub-Subnet-10.0.12.0/24
- Pri-Subnet-10.0.1.0/24
- Pir-Subnet-10.0.2.0/24
创建互联网网关:
此步创建一个互联网网关,然后将此网关Attach到你上文创建的VPC上。
创建NAT网关:
接下来创建NAT网关,选择一个公网子网。这个NAT网关是为了私有子网里的EC2访问互联网使用的。
在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数据库:
- 这里选择多可用区部署,设置数据库名字‘wordpressdb’,以及主密码。安全组选择前面创建的‘PrivateDB-SG’安全组,子网选择上文创建的两个私有子网‘Pri-Subnet-10.0.1.0/24’ 以及‘Pir-Subnet-10.0.2.0/24’
通过堡垒机以管理员身份登录到数据库,做一下配置:
- 为您的 MySQL 数据库创建用户和密码。安装 WordPress 的过程将使用这些值与您的 MySQL 数据库通信。输入以下命令,以替换唯一的用户名和密码。
CREATE USER ‘wordpress-user’@’localhost’ IDENTIFIED BY ‘your_strong_password’;
- 创建数据库。为数据库提供一个有意义的描述性名称,例如 wordpress-db
CREATE DATABASE `wordpress-db`;
- 对您之前创建的 WordPress 用户授予您数据库的完全访问权限。
GRANT ALL PRIVILEGES ON `wordpress-db`.* TO “wordpress-user”@”%”;
- 刷新数据库权限以接受您的所有更改。
FLUSH PRIVILEGES;
- 退出 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
在配置安全组一步,选择上文创建的安全组‘private-wordpress-web-sg ‘:
选择你创建的启动配置,选择创建Auto Scaling Group ASG:
选择2个实例启动,选择上文创建的VPC,这里选择两个AZ的子网实现高可用。
为了实验,我们只需保持该自动扩展组大小为原始2个就可以。下一步配置通知,你可以创建一个SNS邮件通知,一旦EC2有重启等事件会自动通知到你,这里就不介绍了。
创建负载均衡器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,将域名解析到负载均衡器:
- 创建一个托管区域,域名是你拥有的公网域名。
- 然后选择创建一个记录集(RecordSet),选择别名alias,在别名目标里选择你的负载均衡器域名(选择你的负载均衡器,下方的描述里能找到这个DNS名称)
这样整个配置就结束了,如果每步都配置正确,你应该可以访问你创建的WordPress网站了。