LNMP+WordPress

LNMP+WordPress架构实现

本实验创建lnmp架构,数据库采用一主两从的结构跑在docker容器内,实现主从复制,用proxysql实现读写分离;WordPress站点采用Nginx+php的结构实现高可用(10.10.10.25,10.10.10.6),wordeprss中用户上传的图片使用nfs共享存储并实现nfs高可用,两台nfs服务器之间采用inotify+rsync实现实时同步;整个集群的前端采用nginx做代理服务器接受用户请求。

搭建数据库主从复制和读写分离

本次实验在10.10.10.8上采用docker容器的方式实现mysql主从,在宿主机上安装proxysql实现读写分离。

在容器中运行三个mysql的容器,并实现主从复制

下载镜像并运行容器

1
2
3
4
[root@10-10-10-8 ~]#docker image pull mysql:5.7
[root@10-10-10-8 ~]#docker run --name db1 -d --network bridge -h db1 -v /vols/db1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=centos mysql:5.7
[root@10-10-10-8 ~]#docker run --name db2 -d --network bridge -h db2 -v /vols/db2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=centos mysql:5.7
[root@10-10-10-8 ~]#docker run --name db3 -d --network bridge -h db3 -v /vols/db3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=centos mysql:5.7

修改容器的配置文件,并实现db1做主库,db2,db3做从库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[root@10-10-10-8 ~]#docker exec -it db1 bash
root@6b1fb7a017b4:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server_id=1 #指定server_id
log_bin #开启二进制日志
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 172.17.0.2
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
root@6b1fb7a017b4:/# mysql -puroot -pcentos
mysql> grant replication slave on *.* to 'repluser'@'10.10.10.%' identified by 'centos';
[root@10-10-10-8 ~]#docker exec -it db2 bash
root@cc12db5e3e58:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server_id=2 #指定server_id
read-only #只读,为实现读写分离必须在从服务器配置只读属性
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 172.17.0.3
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
root@cc12db5e3e58:/#mysql -uroot -pcentos
mysql> CHANGE MASTER TO
MASTER_HOST='172.17.0.2',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='host-10-10-10-6-bin.000001', #指定主库的日志
MASTER_LOG_POS=120, #指定主库的节点
MASTER_CONNECT_RETRY=10;
mysql> start slave;
[root@10-10-10-8 ~]#docker exec -it db3 bash
root@cc12db5e3e58:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server_id=3 #指定server_id
read-only #只读,为实现读写分离必须在从服务器配置只读属性
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 172.17.0.3
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
root@cc12db5e3e58:/#mysql -uroot -pcentos
mysql> CHANGE MASTER TO
MASTER_HOST='172.17.0.2',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='host-10-10-10-6-bin.000001', #指定主库的日志
MASTER_LOG_POS=120, #指定主库的节点
MASTER_CONNECT_RETRY=10;
mysql> start slave;

在宿主机上安装proxysql,并实现读写分离

安装启动proxysql,并在proxysql上添加所有的数据库节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@10-10-10-8 ~]#cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
[root@10-10-10-8 ~]#systemctl start proxysql
[root@10-10-10-8 ~]#mysql -uadmin -padmin -P6032 -h127.0.0.1
MySQL > insert into mysql_servers(hostgroup_id,hostname,port)
values(10,'172.17.0.2',3306);
MySQL > insert into mysql_servers(hostgroup_id,hostname,port)
values(10,'172.17.0.3',3306);
MySQL > insert into mysql_servers(hostgroup_id,hostname,port)
values(10,'172.17.0.4',3306);
MySQL > load mysql servers to runtime;
MySQL > save mysql servers to disk;
[root@10-10-10-8 ~]#
[root@10-10-10-8 ~]#
[root@10-10-10-8 ~]#
[root@10-10-10-8 ~]#

在master上添加监控用户

1
2
3
[root@10-10-10-8 ~]#docker exec -it db1 bash
root@6b1fb7a017b4:/# mysql -puroot -pcentos
MySQL > grant replication client on *.* to monitor@'172.17.0.%' identified by 'centos';

在proxysql上配置监控用户

1
2
3
4
5
[root@10-10-10-8 ~]#mysql -uadmin -padmin -P6032 -h127.0.0.1
MySQL [(none)]> set mysql-monitor_username='monitor';
MySQL [(none)]> set mysql-monitor_password='centos';
MySQL [(none)]> load mysql variables to runtime;
MySQL [(none)]> save mysql variables to disk;

在proxysql上设置分组信息

1
2
3
mysql > insert into mysql_replication_hostgroups values(10,20,"test");
mysql > load mysql servers to runtime;
mysql > save mysql servers to disk;

在master节点上创建WordPress用的数据库和管理员用户

1
2
mysql> create database wpdb;
mysql> grant all on wpdb.* to 'wpuesr'@'10.10.10.%' identified by 'centos';

在proxysql上配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库。

1
2
3
mysql > insert into mysql_users(username,password,default_hostgroup) values('wpuser','centos',10);
mysql > load mysql users to runtime;
mysql > save mysql users to disk;

在proxysql上配置路由规则,将select语句分离到20的读组,select语句中有一个特殊语句SELECT…FOR UPDATE它会申请写锁,应路由到10的写组

1
2
3
4
5
mysql > insert into mysql_query_rules
> (rule_id,active,match_digest,destination_hostgroup,apply)VALUES
> (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
mysql >load mysql query rules to runtime;
mysql >save mysql query rules to disk;

搭建web服务器

搭建两套Nginx+php服务器,并将用户上传的图片等静态资源通过nfs服务实现共享存储,nfs服务器也搭建两台,并通过inotify+rsync实现实时备份。

搭建nginx+php

本实验的web服务器有两台,以实现高可用,由于连哪个台服务器的配置并无差异,故只演示其中一台的安装配置步骤。

编译安装php-7.2.14

安装php相关依赖包

1
~]#yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-deve

创建php运行用户

1
~]#useradd -r -s /sbin/nologin

到官网下载php-7.2.14源码包,并编译安装

1
2
3
4
5
6
7
8
[root@host-10-10-10-25 src]#pwd
/usr/local/src
[root@host-10-10-10-25 src]#ls
php-7.2.14.tar.gz
[root@host-10-10-10-25 src]#tar xf php-7.2.14.tar.gz
[root@host-10-10-10-25 src]#cd php-7.2.14
[root@host-10-10-10-25 src]#./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/conf.d --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pear --with-curl --with-png-dir --with-freetype-dir --with-iconv --with-mhash --with-zlib --with-xmlrpc --with-xsl --with-openssl --with-mysqli --with-pdo-mysql --disable-debug --enable-zip --enable-sockets --enable-soap --enable-inline-optimization --enable-xml --enable-ftp --enable-exif --enable-wddx --enable-bcmath --enable-calendar --enable-shmop --enable-dba --enable-sysvsem --enable-sysvshm --enable-sysvmsg
[root@host-10-10-10-25 src]#make && make install

php安装好之后无需做过多配置,只需生成相关配置文件即可

1
2
3
4
5
6
7
8
9
10
[root@host-10-10-10-25 etc]#pwd
/usr/local/php/etc
[root@host-10-10-10-25 etc]#cp php-fpm.conf.default php-fpm.conf
[root@host-10-10-10-25 etc]#mv php-fpm.d/www.conf.default php-fpm.d/www.conf
[root@host-10-10-10-25 etc]#vi php-fpm.d/www.conf
pm.max_children = 8 #最大子进程数量
pm.start_servers = 4 #初始子进程数量
pm.min_spare_servers = 4 #最小空闲数量
pm.max_spare_servers = 6 #最大空闲数量
[root@host-10-10-10-25 etc]#/usr/local/php/sbin/php-fpm #开启php
yum安装Nginx并配置反向代理

有与yum提供的包已经到1.12.2,所以采用yum安装的方式。安装好之后配置反向代理,将动态请求通过fastcgi转发至php。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@host-10-10-10-25 etc]#yum -y install nginx
[root@host-10-10-10-25 etc]#vi /etc/nginx/nginx.conf
http {
server {
listen 80;
server_name www.msq.com;
root /usr/share/nginx/html;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
}

运行WordPress

到官网下载WordPress,并放入php的工作目录中,做相应配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@host-10-10-10-25 src]#pwd
/usr/local/src
[root@host-10-10-10-25 src]#wget https://cn.wordpress.org/wordpress-5.0.2-zh_CN.tar.gz
[root@host-10-10-10-25 src]#tar xf wordpress-5.0.2-zh_CN.tar.gz
[root@host-10-10-10-25 src]#cp -r wordpress/* /usr/share/nginx/html/
[root@host-10-10-10-25 src]#cd /usr/share/nginx/html/
[root@host-10-10-10-25 html]#cp wp-config-sample.php wp-config.php
[root@host-10-10-10-25 html]#vi wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wpdb');

/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');

/** MySQL数据库密码 */
define('DB_PASSWORD', 'centos');

/** MySQL主机 */
define('DB_HOST', '10.10.10.8');

[root@host-10-10-10-25 html]#chown -R www.www .

此时,lnmp+php+WordPress敬意初步搭建完成,在浏览器访问web站点即可完成WordPress的安装,下面继续剩余工作。

搭建nfs共享存储服务器

安装启动配置nfs服务器,centos7可移植接启动nfs,而centos6则需要先启动rpcbind再启动nfs。

1
2
3
[root@10-10-10-11 ~]#yum -y install nfs
[root@10-10-10-11 ~]#vi /etx/exports.d/data.exports
/nfsdata/images 10.10.10.0/24(rw,no_root_squash)

在两个web上都将该共享目录挂载,挂载的服务器上也需要安装nfs-utils包,否则有可能导致写入性能非常差!

1
[root@host-10-10-10-25 uploads]#mount 10.10.10.11:/nfsdata/images /usr/share/nginx/html/wp-content/uploads

通过inotify+rsync实现nfs的实时备份容灾