上一篇大概的介绍了一下高可用的wordpress的设计结构。这个设计图会涉及到VPC,EC2,ELB,RDS,S3,CloudFront,Auto Scaling,IAM和CloudWatch等核心服务,对于了解各部分的功能是个很好的练习。


现在我们开始具体的配置,豆子会配置一个Ubuntu14 的WordPress,该服务器和MySQL数据库都具有高可用的功能,还可以通过CPU的负荷自动添加或者删除现有实例。具体的配置包括以下步骤:


  1. 创建基本的网络和防火墙

  2. 配置高可用MySQL

  3. 创建一个Ubuntu 14实例

  4. Ubuntu安装LAMPStack

  5. 配置S3和CloudFront CDN

  6. 配置Ubuntu Virtual Host

  7. 配置Route 53 DNS 

  8. 测试通过之后配置成AMI镜像

  9. 配置ELB

  10. 配置Auto scaling

  11. 测试



首先我们需要配置一个基本的VPC 网络和IAM角色。


之前的博客里面我已经创建了一个IAM的角色 ec2-s3,可以允许关联的虚拟机默认就有访问S3 Bucket的权限。


如下所示:


wKioL1QKeFGhuYy4AAEnsTK0kDM706.jpg


接下来创建一个新的VPC网络 wordpressbeanxyz


wKiom1QKeEzQH2G5AAC3SE9amLo636.jpg


创建2个子网,分别位于不同的AZ

wKiom1QKeE7ib0TmAAC6_11hMnE841.jpg


创建Internet 网关

wKioL1QKeFngpokrAADOxzuklkE010.jpg

配置路由表


wKiom1QKeFDjj2FdAADohziwXbw875.jpg



新建一个Security Group,配置允许访问的端口


wKioL1QKeFuAZX5iAADJsiaihgg604.jpg

准备工作差不多了,先来创建个MySql的高可用实例吧。




点击RDS

wKiom1QKeFWyLcjQAABsAm3jpfk601.jpg


选择Multi-AZ Deployment

wKioL1QKeF6BQjc_AADrfqOxtHk018.jpg

豆子账号所在的Sydney区域还无法创建micro级别的Multiple实例,亚马逊逼着我用更贵的实例,好吧

wKiom1QKeFnA3ueMAADKtZOlGbM194.jpg


级别改成small就行了。

wKiom1QKeFui67V8AADRBrGgjcY588.jpg

直接选择默认VPC

wKioL1QKeGXhhW5mAAEjH2lQ1Qs860.jpg


创建成功

wKioL1QKeGfxq6DnAADUnYn5Tx4826.jpg

正在创建,大概要10分钟才会完全配置结束

wKiom1QKeGTjl0_GAAG6pDajGdE977.jpg


至此,基本的数据库和网络结构就算搭建起来了,接下来我们来搭建个虚拟机测试一下。


具体的EC2加载和Putty连接过程就省略了,这个是最最基本的操作。


豆子加载了一个Unbuntu 14的EC2实例,Putty连接之后


首先安装相关LAMP Stack

wKiom1QKfLDgWHRnAAB7CBWbwLU647.jpg

AWS的命令行也得安装

wKioL1QKfLizRvrcAAAxlL6FElc493.jpg

测试一下成功安装

wKiom1QKfLKAQvvfAABAguu8e10977.jpg

如果没有配置IAM的角色,要想访问S3 那就只能通过 aws configure来输入secret key才行了

wKiom1QKfquQbc9YAAAz5xvqJRc740.jpg


接下来下载安装wordpress


wKioL1QKfLrAeBAtAAAzga5ztcs209.jpg

解压

wKiom1QKfLTA0Ye2AAAvbBYeMMM216.jpg

修改配置文件

wKioL1QKfLzT5BpDAAAptNjjWmA546.jpg

数据库的名称,用户名,密码以及地址(这里输入MySql 实例的EndPoint)

wKiom1QKfLaDuFALAABmi4LZLrs786.jpg

然后把整个文件夹拷贝到 apache的根目录下 /var/www/wordpress

wKioL1QKfL7Sxd3oAAApTmJTrqs293.jpg

修改一下访问权限,确保用户可以访问

wKiom1QKfLiwnkp9AAApPSuyIOA132.jpg

wKioL1QKfMDA7VHZAAAlGVr5b5I525.jpg


然后配置一下virtual host 文件。Ubuntu14里面的默认文件是 000-default.conf,把他拷贝出来,重命名为wordpress.confg

wKiom1QKfLqAQ-t7AAA_1EGpQAc309.jpg


修改一下内容

wKioL1QKfMLzZ8gkAAA19Y6ZiZg695.jpg


添加域名和根目录

wKiom1QKfL2yjzylAAD3aL22Zmc908.jpg


重新加载一下这个配置文件

wKioL1QKfMXQA780AAA9JnZ3tUU460.jpg

重启apache

wKiom1QKfL_yMPo6AABExmvpW5w775.jpg


然后通过aws的命令把对应的wordpress文件夹和virtual host的配置文件备份回S3保存。通过这种方式,我们可以通过Bootstrap来给之后新创建的服务器同步最新的配置信息。

wKioL1QKfMeQkKzvAAA_SLgaPNo871.jpg

wKioL1QKfMjQ8ipCAABOxLG8lj8241.jpg


打开S3的管理界面看看是否已经同步

wKiom1QKgDfQDBsWAABEbCQ2BIM333.jpg


接下来需要设定一下DNS,打开Route53,我已经创建了Hosted Zone了。这个域名我是在goDaddy上注册的,把NS的服务器在goDaddy指向aws即可转移到Route53上。


wKioL1QKgEDyoTTRAACHWUzRxns632.jpg

创建一个域名 blog.beanxyz.com然后指向虚拟机的公网IP

wKioL1QKgEOzgbPgAAFbKP6W4Nk098.jpg

输入域名试试看,成功加载wordpress

wKiom1QKgD3CfhCSAAC-86LnLYI758.jpg

输入初始化信息

wKiom1QKgD-ixRgqAACTzRrCsdI543.jpg


Ubuntu 14上的WordPress就可以算是成功搭建了。 不过这个时候只有数据库是高可用的,WordPress服务器还不是,上面的媒体数据也是保存在本地硬盘上的。

wKioL1QKgEmzpiHAAAEmuPuQmSA195.jpg


新建一个Post,插入一张图片

wKioL1QKgEqS0D5bAABzBknlLK8880.jpg


可以看见,图片是保存在 /wp-content/uploads 的本地磁盘里面的

wKiom1QKgEegLLd9AAHuLJQ_1Rg249.jpg


为了保证全球各地的访问速度都很快,我们需要创建一个CDN 网络,CDN的Orgin 服务器指向S3,所有的图片信息都需要保存在对应的S3 bucket里面。


新建一个 S3 bucket, wordpressbeanxyzcdn

wKioL1QKgE_S3CsnAABaQM4SyWA075.jpg

修改属性,创建一个Bucket Policy,允许所有用户对其中的内容都具有只读权限

wKiom1QKgFPDpu8bAAB-wVkBzc4084.jpg


然后创建一个CloudFront Url

wKiom1QKgEqwW7_nAAC2rN0ppA8142.jpg

选择Web

wKiom1QKgE3z09CoAAEFU3n9Odc960.jpg

分布点指向S3 bucket

wKiom1QKgE_j4LZxAAEp9yLG0D0424.jpg


通过S3 sync同步图片到我们的S3 Bucket里面

wKioL1QKgFmBoV0MAAD8vSR0Fd8681.jpg


确认一下Url,S3 bucket和本地磁盘的内容已经同步了

wKioL1QKgF7yDjWEAAGldDnzX84679.jpg


然后在crontab里面创建一个计划任务,每分钟同步一次

wKioL1QKgF_wdkJvAABQva7mM3Y927.jpg

wKiom1QKgFrxCE1hAACIEbT8Ue4310.jpg


同时,还需要修改vitual host文件,用CDN的地址来替换本地磁盘的访问地址

wKioL1QKgGLCkeTiAABMDIT6pgs061.jpg

打开 rewrite的功能,然后重启apache

wKiom1QKgFyiXBpvAAAzTd4HDLE694.jpg


再从wordpress上点开图片的地址,发现已经是CDN的地址了

wKioL1QKgGajbI4yAAFVVbPJFoE615.jpg

最后别忘记通过aws s3 cp命令把最新的改动都保存回S3 bucket


然后通过这个EC2创建一个AMI 镜像

wKiom1QKgGHQKfJrAADDEtNo1SE319.jpg


之后我们可以通过这个AMI和Auto Scaling 自动创建新的虚拟机

wKioL1QKgGqTM5y_AACO6IC2zCY532.jpg


现在我们来配置一下WordPress的高可用功能,Elastic load balancer。


新建一个ELB

wKiom1QKgGbDH4qGAAErGbQH-_Q726.jpg

wKioL1QKgG_yIhW8AAD024Uablo774.jpg

把我创建的2个子网都放进去,这样自动创建的虚拟机会在不同的数据中心进行负载平衡

wKiom1QKgGrCCS7mAADx-rO9c6I748.jpg


指向之前创建的SG

wKiom1QKgGzRAlLvAACktk-ygQ4725.jpg

这就创建好了


wKiom1QKgHGykzsMAAC6CrDuJ0U232.jpg

创建好之后,我们还需要修改一下之前的DNS,使得我的blog.beanxyz.com指向ELB的地址,而不是直接指向某个虚拟机的公网IP

wKioL1QKgHzhZ-msAAFl1YUsKhs380.jpg

wKioL1QKgH_QoIAtAAGCNS3hA5w435.jpg

nslookup看看是否已经更改。

wKiom1QKgHnws32EAABPgZ9EEyI282.jpg


最后,我们来创建新的Auto Scaling Group



wKioL1QKhaShlKwwAACMsWTzN08518.jpg

wKioL1QKhaeDe_b0AAGZyV1A0IY475.jpg

选择之前创建的AMI镜像

wKiom1QKhaLBchZ8AACo17YdZQM449.jpg

wKioL1QKhavw286yAAEKZtNKUWI433.jpg


配置虚拟机,注意在User Data里面可以通过Bootstrap来预配置信息

wKiom1QKhanhdevbAAFtqqx0vo4015.jpg

剩下的基本上默认选项按部就班的点下去就行了

wKiom1QKhauQD_zvAAD6-jBoUic222.jpg

wKioL1QKhbSCqya8AADJS4W1wow631.jpg


勾选ELB,这样新创建的EC2,自动会加入ELB进行负载平衡


wKioL1QKhbfxhamNAAFCFB9Uod0477.jpg

根据CPU的变化自动添加删除实例,这个之前豆子的博客已经详细介绍过了


wKiom1QKhbOyJrcwAAEjO7g52Vs392.jpg

wKioL1QKhbyyHo7_AAEmSD1Pxis340.jpg

wKiom1QKhbejdqymAACZYf8HoqM045.jpg

AS配置完毕之后,因为我设置的初始状态需要2台服务器,他会自动立刻创建2个实例,可以在ELB的配置界面里面查看

wKiom1QKhbrjlc-uAAFZlcULLWM358.jpg

也可以在EC2的配置界面下查看


wKioL1QKhcjxAjeAAAE3qWwimd8481.jpg

手动删除一台实例,访问仍然成功!

wKiom1QKhcXg7Z-2AADpqc3NXOE940.jpg