本指南将使用双Linode集群配置高可用的WordPress站点,数据库采用MySQL双主复制(Master-Master replication),并使用Linode NodeBalancer作为前端管理工具。

先决条件

本指南基于Debian 7或Ubuntu 14.04编写。要完成该指南,请确保您的账户中至少存在两个Linode节点和一个NodeBalancer。两个Linode节点都需要私有IP地址。同时还要确保已经在Linode节点上配置了SSH密钥,并且还需将另一台Linode主机的SSH密钥添加在本机的/.ssh/authorized_keys文件中。

注意

本指南是为非root用户编写的,会在需要提升权限的命令之前加上sudo。如果您不熟悉sudo命令,请参阅Linux用户和用户组指南。

安装所需软件包

使用以下命令在每个Linode节点上安装Apache,PHP和MySQL:

1
2
3
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install apache2 php5 php5-mysql mysql-server mysql-client

编辑MySQL配置文件以设置双主复制

1.编辑每个Linode节点上的/etc/mysql/my.cnf配置文件,添加或修改以下值:

Server 1:

1
2
3
4
5
6
7
8
9
10
server_id           = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1

Server 2:

1
2
3
4
5
6
7
8
9
10
server_id           = 2
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2

2.对于每个Linode节点,编辑bind-address配置以使用私有IP地址:

1
bind-address    = x.x.x.x

3.修改完配置文件后,重启MySQL应用:

1
sudo service mysql restart

创建复制用户

1.在每台Linode节点上登录MySQL:

1
mysql -u root -p

2.在每台Linode节点上配置复制用户。将x.x.x.x替换为另一台Linode节点的私有IP地址,并将password修改为强密码:

1
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x' IDENTIFIED BY 'password';

3.返回终端,运行以下命令以测试配置。使用另一台Linode节点的私有IP地址:

1
mysql -ureplication -p -h x.x.x.x -P 3306

此时您应该可以通过以上命令连接到远程服务器的MySQL实例。

配置数据库同步复制

1.在第一台服务器上登录MySQL,查询主节点状态:

1
SHOW MASTER STATUS;

请注意显示的文件名和所在位置:

1
2
3
4
5
6
7
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 277 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2.在第二台服务器上,根据MySQL的提示,为该数据库设置从属功能。将x.x.x.x替换为第一台服务器的私有IP。还要将master_log_filemaster_log_pos替换为上一步中对应的值:

1
2
3
SLAVE STOP;
CHANGE MASTER TO master_host='x.x.x.x', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=277;
SLAVE START;

3.在第二台服务器上,查询主节点状态。注意文件名及其所在位置:

1
SHOW MASTER STATUS;

4.在第一台服务器上设置从属数据库状态,重复步骤2,并将需要修改的值替换为第一台服务器上相对应的值:

1
2
3
SLAVE STOP;
CHANGE MASTER TO master_host='x.x.x.x', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=277;
SLAVE START;

5.在两台Linode节点上退出MySQL:

1
exit

配置Apache

两台Linode服务器均需要执行本章节的以下步骤。

注意

请将之后出现的example.com替换为您的域名。

1.输入以下命令禁用默认的Apache虚拟主机:

1
sudo a2dissite *default

2.切换至/var/www目录:

1
cd /var/www

3.输入以下命令,创建用来保存网站的文件夹:

1
sudo mkdir example.com

4.在您刚刚创建的文件夹中创建一组文件夹,以存储您网站的文件、日志和备份:

1
2
sudo mkdir example.com/public_html
sudo mkdir example.com/log

5.为网站创建虚拟主机文件:

/etc/apache2/sites-available/example.com.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# domain: example.com
# 域名: example.com
# public: /var/www/example.com/public_html/
# 网站根目录: /var/www/example.com/public_html/

<VirtualHost *:80>
# Admin email, Server Name (domain name), and any aliases
# 管理员邮箱地址, 服务器名 (域名), 服务器别名
ServerAdmin webmaster@example.com
ServerName www.example.com
ServerAlias example.com

# Index file and Document Root (where the public files are located)
# 索引文件以及根目录 (网站页面文件存放位置)
DirectoryIndex index.html index.php
DocumentRoot /var/www/example.com/public_html
# Log file locations
# 日志文件存放位置
LogLevel warn
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/access.log combined
</VirtualHost>

警告

在Apache 2.4(Ubuntu 14.04使用的版本)及之后的版本中,虚拟主机文件必须以.conf扩展名作为结尾。.conf扩展名在之前版本的Apache兼容。

6.输入以下命令启用新网站:

1
sudo a2ensite example.com.conf

7.重启Apache:

1
sudo service apache2 restart

安装WordPress

1.在Linode主节点上,下载并安装最新版本的WordPress。请根据您的实际配置替换以下命令中列出的所有路径:

1
2
3
4
cd /var/www
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
cp -R wordpress/* /var/www/example.com/public_html

2.配置MySQL数据库以安装WordPress。您需要将wordpressuserpassword替换为您自己的设置:

1
2
3
4
5
mysql -u root -p
CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
EXIT

3.设置网站根目录权限以确保WordPress能够完成其配置步骤:

1
chmod 777 /var/www/example.com/public_html/

4.使用Web浏览器访问您Linode的IP地址,并完成配置步骤以安装全功能的WordPress。

警告

为了确保每个WordPress实例都能定位到本地数据库,您需要将此步骤中的 Database Host(数据库主机)值设置为localhost。这也是WordPress的默认值。

5.通过WordPress管理界面中的 General Settings(常规设置)配置WordPress URL和网站地址,并确保在两个字段中都配置了您的域。

WordPress管理界面
WordPress管理界面

注意

完成WordPress安装步骤并首次登录后,应重置网站根目录的权限以确保安全。您可以使用以下命令来重置根目录权限:

1
chmod 755 /var/www/example.com/public_html/

6.完成WordPress安装步骤后,将配置文件复制到另一台Linode节点。将x.x.x.x替换为另一台Linode节点的IP地址:

1
rsync -r /var/www/* x.x.x.x:/var/www/.

7.登录另一台Linode节点并重启Apache:

1
sudo service apache2 restart

使用Lsyncd配置文件夹同步

1.在Linode集群主节点安装Lsyncd:

1
sudo apt-get install lsyncd

2.创建配置文件以执行同步操作。将x.x.x.x替换为集群中另一台Linode节点的私有IP地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
settings = {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd-status.log"
}
sync {
default.rsyncssh,
delete = false,
insist
source="/var/www",
host="x.x.x.x",
targetdir="/var/www",
rsync = {
archive = true,
perms = true,
owner = true,
_extra = {"-a"},
},
delay = 5,
maxProcesses = 4,
ssh = {
port = 22
}
}

3.启动Lsyncd进程:

1
service lsyncd start

4.测试Lsyncd是否已经成功启动:

1
service lsyncd status

如果此命令返回的结果不是lsyncd is running,请仔细检查lsyncd.conf.lua配置文件,并确保RSA公钥位于从属服务器的正确位置。

5.通过在主Linode节点的/var/www文件夹中创建文件来测试同步复制是否生效。几秒钟后您应该能够在从属Linode节点上的相同路径下看到该文件。

配置您的NodeBalancer

1.打开Linode管理界面中的NodeBalancer选项卡。

2.如果您之前尚未配置,请添加NodeBalancer,并确保它与后端Linode服务器位于同一数据中心。

3.选择您新添加的NodeBalancer并点击“Create Configuration”。按如下所示,编辑配置文件:

1
2
3
4
5
Port: 80
Protocol: HTTP
Algorithm: Least Connections
Session Stickiness: Table
Health Check Type: HTTP Valid Status

4.点击“Save Changes”按钮后,系统将提示您添加Linode节点。为每台节点提供唯一的标签,并在每个节点的地址字段中输入私有网络地址和端口号。

5.添加完两个节点后,确保节点运行状况检查功能处于启用状态。等到两个节点都显示为启动状态,返回NodeBalancer主页并记录列出的IP地址。您现在应该能访问该IP地址并查看您的网站。

为了测试高可用性,可以在其中一个节点上停止Apache2/MySQL服务,或者关闭其中一个节点。即使其中一个节点被标记为关闭状态,您的网站仍可以继续提供服务而不会出现问题。

恭喜,您现在已经成功搭建了高可用的WordPress网站!

参考文章

  1. High Availability WordPress Hosting | Linode
  2. 搭建高可用WordPress网站托管 | 腾讯云+社区