自动可伸缩的WordPress站点的部署

创建和部署一个可扩展WordPress的实例包括MySQL数据库服务器,一GlusterFS分布式文件系统,Nginx的网络服务器和Nginx的负载平衡器。通过使用用户数据和Droplet的元数据,我们将自动化我们网站的部署。

介绍

在本指南中,我们将创建和部署一个可扩展的WordPress实例,包括MySQL数据库服务器,GlusterFS分布式文件系统,Nginx Web服务器和Nginx负载均衡器。 通过使用用户数据Droplet的元数据 ,我们将自动化我们网站的部署。 最后,我们将提供一个Ruby脚本,它将自动化整个过程,并简化可扩展的Wordpress网站的创建。 通过本教程,您将了解在DigitalOcean上部署服务时用户数据和Droplet元数据的强大性和灵活性。

第一步 - 规划我们的部署

我们在本教程中创建的部署将包括单个MySQL数据库服务器,集群中的多个GlusterFS服务器,多个Nginx Web服务器和单个Nginx负载均衡器。

WordPress部署

在我们开始之前,我们应该知道:

  • 我们将使用我们的MySQL服务器的大小Droplet
  • 我们将创建多少个GlusterFS节点
  • 我们的GlusterFS节点的大小
  • 我们将需要多少个Web服务器节点
  • 我们将使用我们的Web服务器的大小Droplets
  • 我们将使用我们的负载均衡器的大小Droplet
  • 我们将用于我们的新网站的域名

我们可以添加额外的节点或扩大我们创建的节点,如果我们需要稍后。 一旦我们决定了这些细节,我们就可以开始部署我们的网站。

第二步 - 部署MySQL

我们将首先部署我们的MySQL服务器。 为此,我们将使用以下用户数据创建一个默认的Ubuntu 14.04 x64 Droplet。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install mysql-server;
mysqladmin -u root create wordpress;
mysqladmin -u root password "mysql_password";
sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;
mysql -uroot -pmysql_password -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY 'mysql_password'";
mysql -uroot -pmysql_password -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

这个用户数据脚本将在我们的新Droplet上执行以下功能:

首先,我们出口一个变量,它告诉apt-get ,我们在非交互模式下运行,以防止它提示任何输入时,它安装软件包。

export DEBIAN_FRONTEND=noninteractive;

接下来,我们使用Droplet元数据获取Droplet的公有和私有IP地址并将它们分配给变量:

export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
Note: Droplet Meta-Data is not available in NYC1, NYC2, and AMS1 at this time.

然后,我们使用apt安装MySQL服务器。

apt-get update;
apt-get -y install mysql-server;

现在,我们需要创建一个名为WordPress的新数据库。

mysqladmin -u root create wordpress;

然后我们为MySQL root用户设置密码。

mysqladmin -u root password "mysql_password";

因为我们的MySQL服务器将接受从我们的Web服务器的查询,我们需要把它侦听的私有IP地址,而不仅仅是localhost 要做到这一点,我们将使用sed做一个查找更新MySQL配置文件,并替换,然后重新启动该服务。

sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;

最后,我们将创建一个新的MySQL用户名为WordPress和给它的权限访问WordPress数据库。

mysql -uroot -pmysql_password -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY 'mysql_password'";
mysql -uroot -pmysql_password -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

通过使用这个用户数据脚本部署我们的新Droplet,我们将配置一个配置的MySQL服务器监听其私有IP地址以及我们配置的数据库和用户,而无需通过SSH或控制台登录。

第三步 - 部署GlusterFS

在部署我们的GlusterFS集群之前,我们需要决定要部署多少个节点。 有两个变量将进入这个决定。 首先,我们需要决定需要多少空间,然后我们需要决定要使用的副本设置。 复制设置告知GlusterFS要存储的任何文件的副本数。 例如,副本设置为2意味着每个文件至少在2台服务器上重复。 这将把我们可用的存储减少一半,因为我们保留每个文件的两个副本,但将提供改进的冗余。 我们创建的GlusterFS节点数必须是我们副本设置的倍数。 对于副本设置为2的集群,我们需要创建2的倍数的节点(因此可以接受2,4,6或8个节点)。

对于此示例,我们将使用副本设置2部署4节点GlusterFS集群。

对于我们的前3个节点,我们将使用以下用户数据脚本:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;

同样,我们先设定DEBIAN_FRONTEND变量,以便apt知道,我们在非交互模式下运行:

export DEBIAN_FRONTEND=noninteractive;

然后,我们更新我们的apt的数据库和安装python-software-properties ,这是需要添加PPA的GlusterFS。

apt-get update;
apt-get install -y python-software-properties;

接下来我们将添加GlusterFS PPA,以便我们可以获取我们的deb包。

add-apt-repository -y ppa:gluster/glusterfs-3.5;

然后,我们会随时更新我们apt再次数据库并安装glusterfs服务器。

apt-get install -y glusterfs-server;

对于我们的前三个节点,这就是我们需要做的。 记下分配给每个新的Droplet的私有IP地址,因为我们在创建我们的最终GlusterFS节点和创建卷时需要它们。

对于最终节点,我们将使用以下用户数据脚本:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;
sleep 30;
gluster peer probe node1_private_ip;
gluster peer probe node2_private_ip;
gluster peer probe node3_private_ip;
gluster volume create file_store replica 2 transport tcp node1_private_ip:/gluster node2_private_ip:/gluster node3_private_ip:/gluster $PRIVATE_IP:/gluster force;
gluster volume start file_store;
Note: If you do not want to enable replication you should not include the "replica" setting in your "volume create" command.

这个用户数据脚本的第一部分非常类似于我们在其他GlusterFS节点上使用的部分,尽管我们将新的Droplet的私有IP分配给$ PRIVATE_IP变量。 一旦glusterfs-server安装,虽然,我们做一些额外的工作。

首先,我们的脚本将等待30秒,使新的glusterfs服务器启动并可用。

sleep 30

然后我们探测我们之前创建的三个GlusterFS Droplets,以便将所有四个添加到一个集群。

gluster peer probe node1_private_ip;
gluster peer probe node2_private_ip;
gluster peer probe node3_private_ip;

接下来我们将创建一个名为“文件存储”为2的副本设置 GlusterFS体积和包括我们的节点的所有四个。 因为我们不会知道我们最新的节点的IP地址,但我们将使用$私有 IP变量它。

gluster volume create file_store replica 2 transport tcp node1_private_ip:/gluster node2_private_ip:/gluster node3_private_ip:/gluster $PRIVATE_IP:/gluster force;

最后,我们将启动新卷,以便我们的客户可以访问:

gluster volume start file_store;

我们现在有一个分布式文件系统,我们可以保留我们的WordPress文件,所有的Web服务器节点都可以访问。

第四步 - 部署Nginx Web服务器

现在我们有一个数据库服务器和一个分布式文件系统,我们可以部署我们的Web服务器。 我们将使用以下用户数据脚本部署我们的第一个Nginx Web服务器节点,并在我们的GlusterFS卷中配置我们的WordPress安装。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs gluter_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;
# Get Wordpress Files
wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;
cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;
sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', 'mysql_password'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', 'mysql_private_ip'/g" /gluster/www/wp-config.php;
chown -Rf www-data:www-data /gluster/www;

这个脚本比我们以前的脚本有点复杂,所以让我们一步一步地分解它。

首先,我们将重新设置DEBIAN_FRONTEND变量,我们已经在我们先前的脚本和填充我们的$PRIVATE_IP变量。

export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)

下一步,我们将更新我们的apt数据库和安装的Nginx的glusterfs客户端,我们需要的PHP库。

apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;

然后,我们将使用sed的查找和替换功能来更新我们php.ini文件和cgi.fixpathinfo变量设置为0。

sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;

现在,我们将创建一个文件夹,名为/gluster在我们的磁盘映像的根目录下有我们的安装量GlusterFS。 然后我们将创建一个fstab条目,以便在Droplet启动时自动挂载GlusterFS卷。

mkdir /gluster;
mount -t glusterfs gluter_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;

然后,我们将创建一个文件夹名为www在我们的GlusterFS卷。 此文件夹将充当我们的Web根。

mkdir /gluster/www;

接下来,我们将从远程服务器拉出一个新的Nginx配置文件。 该文件将我们的Web根目录设置为/gluster/www ,确保Nginx的配置为使用PHP。 您可以查看此配置文件在这里 一旦我们替换了我们的Nginx配置文件,我们将重新启动服务以使此更改生效。

wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

现在我们将抓取最新版本的WordPress的副本,解压缩它并将其内容复制到我们的新Web根。

wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;

接下来,我们将复制样本WordPress的配置文件wp-config.php

cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;

并更新其变量,以配合我们的新环境中,再次使用sed的查找和替换功能。

sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', 'mysql_password'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', 'mysql_private_ip'/g" /gluster/www/wp-config.php;

最后,我们将确保我们的Web根目录中的文件由我们的Nginx的进程将运行作为用户WWW的数据拥有。

chown -Rf www-data:www-data /gluster/www;

现在,我们的第一个Web服务器节点都已设置好,可以接收请求。

由于我们的每个Web服务器节点共享相同的GlusterFS卷用于存储,因此我们创建的每个附加节点的步骤较少。 对于其他节点,我们将使用以下用户数据脚本:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs gluster_node_private_ip:/file_store /gluster;
echo "gluster_node_private_ip:/file_store /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

对于我们的其他Web节点,我们仍然会安装相同的包,安装我们的GlusterFS卷并替换我们的Nginx配置文件,但是我们不需要做任何设置我们的WordPress实例,因为我们在创建我们的第一个节点时。

第五步 - 部署我们的负载均衡器

此部署的最后一步是创建负载均衡器。 我们将使用另一个Nginx服务器来实现此目的。 要设置此节点,我们将使用以下用户数据脚本:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get -y install nginx;
lbconf="
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
      proxy_pass  http://backend;
      include proxy_params;
    }

}

upstream backend  {
    ip_hash;
    server web_node_1_private_ip
    server web_node_2_private_ip
}
"
echo $lbconf > /etc/nginx/sites-enabled/default;
service nginx restart;

对于我们的负载均衡器的用户数据脚本,我们将直接在脚本中构建我们的Nginx配置。 因为我们通过确保与我们的其他Droplet做我们开始多apt知道我们在非交互模式下运行。

export DEBIAN_FRONTEND=noninteractive;

然后我们将安装Nginx:

apt-get update;
apt-get -y install nginx;

接下来我们将创建一个变量所谓新Nginx的配置lbconf 添加上游后端部分我们每一个Web服务器的条目。

lbconf="
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
      proxy_pass  http://backend;
      include proxy_params;
    }

}

upstream backend  {
    ip_hash;
    server web_node_1_private_ip
    server web_node_2_private_ip
}
"

然后,我们将写lbconf变量,我们的Nginx的配置文件,替换其当前内容。

echo $lbconf > /etc/nginx/sites-enabled/default;

最后,我们将重新启动Nginx以使此配置生效。

service nginx restart;

第六步 - 设置DNS

现在,在我们通过浏览器访问我们的新WordPress网站之前,我们应该为它设置一个DNS条目。 我们将通过控制面板这样做。

在DigitalOcean控制面板,单击DNS。 添加域形式,输入你的域名,然后从下拉菜单中选择负载平衡器Droplet,然后单击创建域

为了使用www子域名为您的网站,你需要在这个新的领域创造另一个纪录。

点击添加记录 ,然后选择CNAME记录类型。 在名称字段中输入www,并在主机字段中输入@。 这会将对www子域的请求定向到与您的主域(您的负载均衡器Droplet)相同的位置。

第七步 - 配置WordPress

现在我们已经启动了所有的Droplets并配置了我们的域,我们可以访问我们的新WordPress网站通过访问我们新配置的域在网络浏览器。

配置Wordpress

我们将在此处提示创建一个用户帐户,并为我们的新网站命名。 一旦我们完成这一步,我们的部署就完成了,我们可以开始使用新的网站。

第八步 - 自动化过程

现在,我们可以甚至无需ssh到一个Droplet创造我们的WordPress的部署,我们可以采取更进了一步,并使用自动执行此过程DigitalOcean API

基于本教程创建了一个示例Ruby脚本,它将提示用户提供相关详细信息,然后自动部署一个新的可修改的WordPress实例。 你可以找到这个脚本在GitHub上

结论

我们现在有一个可扩展的WordPress部署,但我们可以采取额外的步骤,以确保我们的新网站是安全和稳定的。