本指南将使用双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:
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:
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:
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地址:
bind-address = x.x.x.x
3.修改完配置文件后,重启MySQL应用:
sudo service mysql restart
创建复制用户
1.在每台Linode节点上登录MySQL:
mysql -u root -p
2.在每台Linode节点上配置复制用户。将x.x.x.x
替换为另一台Linode节点的私有IP地址,并将password
修改为强密码:
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x' IDENTIFIED BY 'password';
3.返回终端,运行以下命令以测试配置。使用另一台Linode节点的私有IP地址:
mysql -ureplication -p -h x.x.x.x -P 3306
此时您应该可以通过以上命令连接到远程服务器的MySQL实例。
配置数据库同步复制
1.在第一台服务器上登录MySQL,查询主节点状态:
SHOW MASTER STATUS;
请注意显示的文件名和所在位置:
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_file
和master_log_pos
替换为上一步中对应的值:
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.在第二台服务器上,查询主节点状态。注意文件名及其所在位置:
SHOW MASTER STATUS;
4.在第一台服务器上设置从属数据库状态,重复步骤2,并将需要修改的值替换为第一台服务器上相对应的值:
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:
exit
配置Apache
两台Linode服务器均需要执行本章节的以下步骤。
注意
请将之后出现的
example.com
替换为您的域名。
1.输入以下命令禁用默认的Apache虚拟主机:
sudo a2dissite *default
2.切换至/var/www
目录:
cd /var/www
3.输入以下命令,创建用来保存网站的文件夹:
sudo mkdir example.com
4.在您刚刚创建的文件夹中创建一组文件夹,以存储您网站的文件、日志和备份:
sudo mkdir example.com/public_html
sudo mkdir example.com/log
5.为网站创建虚拟主机文件:
/etc/apache2/sites-available/example.com.conf:
# 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.输入以下命令启用新网站:
sudo a2ensite example.com.conf
7.重启Apache:
sudo service apache2 restart
安装WordPress
1.在Linode主节点上,下载并安装最新版本的WordPress。请根据您的实际配置替换以下命令中列出的所有路径:
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。您需要将wordpressuser
和password
替换为您自己的设置:
mysql -u root -p
CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
EXIT
3.设置网站根目录权限以确保WordPress能够完成其配置步骤:
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安装步骤并首次登录后,应重置网站根目录的权限以确保安全。您可以使用以下命令来重置根目录权限:
chmod 755 /var/www/example.com/public_html/
6.完成WordPress安装步骤后,将配置文件复制到另一台Linode节点。将x.x.x.x
替换为另一台Linode节点的IP地址:
rsync -r /var/www/* x.x.x.x:/var/www/.
7.登录另一台Linode节点并重启Apache:
sudo service apache2 restart
使用Lsyncd配置文件夹同步
1.在Linode集群主节点安装Lsyncd:
sudo apt-get install lsyncd
2.创建配置文件以执行同步操作。将x.x.x.x
替换为集群中另一台Linode节点的私有IP地址:
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进程:
service lsyncd start
4.测试Lsyncd是否已经成功启动:
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”。按如下所示,编辑配置文件:
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网站!
参考文章