docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统

1.项目概述

网站建设是企业、组织、个人宣传和分享交流的重要的平台,尤其是在如今的信息化时代下,所有行业都在互联网的影响下实现数字化、在线化。在网站的建设中,网站的部署和发布是非常重要的一环,尤其是企业网站,随着企业的影响力和业务规模的扩大,企业的服务器需要承载的访问量和负载也日益增多,这就对企业提供网络服务提出了新的标准。因此,为使得企业网络可以承载更多的访问量和业务需求,我们就需要搭建web集群,实现企业级web集群负载均衡和高可用。而在网站开发的过程中,企业或者个人往往不会考虑从零开始开发,为节约时间和经济成本,通常会选择一款框架来建设和部署网站。在本次项目中,我选取现在国外热门的网站框架——wordpress来进行web集群的安装和部署,以nginx做负载均衡器,配置双网站来承担网站负载,配置NFS共享、mysql主从复制和zabbix监控系统。

1.1 功能需求

1.1.1 wordpress网站框架简介

WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。
WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。
WordPress有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用HTML代码、CSS、PHP等相关知识。
WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。

1.1.2 负载均衡

网站正式上线时,考虑到单台节点的服务器无法承受超负载的HTTP(s)请求时,此时为满足外部的访问量,同时为了方便管理、提高扩展性和安全性以及减少企业开支,通常就需要采用增加服务器部署站点配置负载均衡集群的方法,来提高企业网站的网络服务能力。

1.1.3 高可用

当负载均衡的服务器节点越来越多时,网站规模也越来越大,负载均衡分发器承担的网络流量最大,其在整个集群中的重要性也就不言而喻,一旦节点出现故障甚至宕机,整个集群将无法对外提供服务。因此,除了负载均衡之外,我们同时会部署负载均衡的高可用,即负载均衡器的主备部署。

1.1.4 NFS共享

配置宿主机文件NFS共享,可以通过网络访问共享资源,节省服务器的存储空间。同时可以方便对文件的统一管理。

1.1.5 mysql主从复制

web负载均衡和高可用保证了web软件的正常访问和运行,但却无法保证数据库的安全。而数据对一个网站来说,是非常重要的。因此在基于对数据安全的考虑,我们对mysql设置主从复制,增强数据库的安全性。

1.1.6 监控系统

为方便网站的运营和维护,对整个集群进行监控,我们另外设置一台服务器来监控系统的运行状态。方便在监控网站各服务器的运行,以备在系统出现问题,能快速找到应对方案,减少企业的损失。

1.2 完成度

本次项目着重对web应用的部署和mysql数据库的主从部署,通过nginx负载均衡分担网络流量,同时使用zabbix进行网络的监控。

2.系统设计

2.1系统结构图表

此次实验环境为centos上的docker系统,系统搭建如图所示:
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第1张图片

2.2系统地址以及软件分布表

系统的地址以及软件环境如下:
容器(Container) 操作系统(OS) IP地址 安装软件
宿主机(docker) CentOS7 192.168.131.100 Docker
nginx1 CentOS7 172.18.0.11 nginx
web CentOS7 172.18.0.111 apache+php
web1 CentOS7 172.18.0.112 apache+php
mysql-master CentOS7 172.18.0.201 Mysql
mysql-slave CentOS7 172.18.0.202 mysql
zabbix CentOS7 172.18.0.254 zabbix
network 172.18.0.0/16

3.项目实现

3.1容器准备

在宿主机上安装docker,在此次实验中,我使用的是centOS7的linux环境。
使用下面的命令安装docker:

# yum install docker -y
# systemctl start docker
# systemctl enable docker

此次项目中,使用了六个容器,如图所示:

# docker network create --subnet=172.18.0.0/16 cluster
# docker run -d --privileged --net cluster --ip 172.18.0.11 -p 80:80 --name nginx1 172.18.74.119/netlab/nginx  /usr/sbin/init
# docker run -d --privileged --net cluster --ip 172.18.0.111 --name web wpserver  /usr/sbin/init
# docker run -d --privileged --net cluster --ip 172.18.0.112 --name web1 wpserver  /usr/sbin/init
# docker run -d --privileged --net cluster --ip 172.18.0.201 --name mysql-master mysql-wpdata /usr/sbin/init
# docker run -d --privileged --net cluster --ip 172.18.0.202 --name mysql-slave mysql-wpdata   /usr/sbin/init
# docker run -d --privileged --net cluster --ip 172.18.0.254 -p 8080:80 --name zabbix 172.18.74.119/netlab/zabbix  /usr/sbin/init

3.2 Nginx负载均衡器

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强。Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
无缓存的反向代理加速,简单的负载均衡和容错。
FastCGI,简单的负载均衡和容错。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
支持 SSL 和 TLSSNI。

3.2.1 下载安装配置nginx

$  yum install epel-release -y
$  yum install nginx -y
vim /etc/nginx/conf.d/default.conf
server {    listen 80 ;
        location / { proxy_pass http://APP;}
}
	upstream APP{
        server 172.18.0.111;
        server 172.18.0.112;
  	}

3.2.2 启动nginx

$  systemctl start nginx
$ systemctl enable nginx

3.3 web 服务器(apache+php)

3.3.1 安装apache和php

# yum install httpd php -y
# systemctl start httpd
# systemctl enable httpd

3.3.2 下载wordpress

# cd /var/www/html
# wget  https://wordpress.org/latest.tar.gz
# tar -zxvf latest.tar.gz

3.3.3 配置apache服务器

配置网站根目录为wordpress的目录

# vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/wordpress"

    AllowOverride None
    # Allow open access:
    Require all granted

3.3.4 PHP版本问题和wordpress的安装探索

docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第2张图片
升级php到php7
检测现有安装的php版本

# rpm -qa |grep php

删除原先有的php,并安装php7(wordpress5 兼容php7,但是部分主题插件不兼容)

# yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 
# rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# yum install php70w

3.3.5 检测php环境

出现如下页面,表示web服务器环境ok,出现如下页面后,因为在集群中mysql与web服务器要分开,因此在这里我们先暂停,配置好mysql服务器,我们再接着完成wordpess的安装工作。
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第3张图片

3.4 NFS配置

docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第4张图片

3.4.1 宿主机安装nfs,配置共享目录

  1. 安装配置nfs

    #yum install nfs-utils //使用yum方式安装nfs
    #vim /etc/sysconfig/nfs
    #systemctl start rpcbind //启动rpcbind服务,查看监听端口

docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第5张图片
在这里插入图片描述

2.新建 /var/www/html/wordpress/wp-includes目录为共享目录,设置权限为777
这里我只将wp-includes即wordpress的核心文件设置为nfs共享,其他需要设置nfs共享的目录可以按照相同的思路进行配置。
3.编辑/etc/exports文件

/var/www/html/wordpress/wp-includes  172.18.0.*(rw,sync)

重启nfs服务
3.4.2 配置web容器,挂在共享目录

# yum install nfs-utils   //进入容器并安装nfs
showmount -e 172.18.0.1 //在APP1查看nfs上的共享目录
共享目录挂在到本地目录
# mount 172.18.0.1:/var/www/html/wordpress/wp-includes  /var/www/html/wordpress/wp-includes

3.5 mysql服务器

3.5.1 安装mysql

# yum install mysql mysql-server -y
# systemctl enable mysqld
# systemctl start mysqld

3.5.2 修改初始密码

方法一:
1、使用空的初始密码登录mysql账号:
mysql-uroot -p
2、修改root密码:
SETPASSWORD = PASSWORD('123456');
方法二:
1、使用空的初始密码登录mysql账号:
mysql-uroot -p
 
2、修改root密码:
mysqladmin -u root password '123456'
方法三:
1、使用空的初始密码登录mysql账号:
mysql-uroot -p
 
2、修改root密码:
mysql> update user set Password=password("123456") where User='root';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)
mysql> select Host,User,password from user where user='root';
+-----------------------+------+-------------------------------------------+
| Host                  | User | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root | *5626ED34B75C6C508BA2A3D0A4F6E4C58823138C |
| localhost.localdomain | root | *5626ED34B75C6C508BA2A3D0A4F6E4C58823138C |
| 127.0.0.1             | root | *5626ED34B75C6C508BA2A3D0A4F6E4C58823138C |
| ::1                   | root | *5626ED34B75C6C508BA2A3D0A4F6E4C58823138C |
+-----------------------+------+-------------------------------------------+
4 rows in set (0.00 sec)

3.5.3 添加wordpress 用户和权限

(1)赋予wordpress软件服务器器访问权限

mysql> grant all privileges on wordpress.* to wordpress@'172.18.0.111' identified by '123';
mysql> grant all privileges on wordpress.* to wordpress@'172.18.0.112' identified by '123';
mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
//删除空用户
mysql> delete from mysql.user where User="";

mysql> flush privileges;

(2)创建wordpress数据库
A.倘若你是在公网的环境下进行,服务器都有公网地址,则在此处可以直接创建wordpress数据库,并通过网页进行安装。

mysql> create database wordpress;

在安装时会设置mysql的服务器地址,以及后台登录账号和密码,但是由于我这里采用的时docker的内部环境,因此在安装过程中出现了一些问题,不过幸运的是,都找到了解决方法。解决过程如下:
1)服务器无法连接
因为web安装时会从web端对服务器进行检测,但是通过主机访问时无法正常连接到服务器,因此需要在web服务器端进行一些操作。
A.复制wp-config-sample.php文件为wp-config.php,编辑文件内容如下:

/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB_USER', 'wordpress' );
/** MySQL database password */
define( 'DB_PASSWORD', '123' );
/** MySQL hostname */
define( 'DB_HOST', '172.18.0.201' );

B.刷新网页后,还会设置一些选项,网站的名称,副标题
C.最重要的一点,你会发现网站的外观样式是没有的(如下图所示),这是因为网站自行安装时后台自动添加解析的网址,如果通过nginx过去,自动填写的是http://APP/wordpress,需要修改数据库中的一些参数
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第6张图片
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第7张图片
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第8张图片

mysql> update wp_options set option_value="http://192.168.131.100" where option_name="home";
Query OK, 0 rows affected (0.08 sec)
Rows matched: 1  Changed: 0  Warnings: 0
mysql> update wp_options set option_value="http://192.168.131.100" where option_name="siteurl";
Query OK, 0 rows affected (0.07 sec)
Rows matched: 1  Changed: 0  Warnings: 0

给wordpress数据库加入一个管理员权限的用户
:在此次环境中,我采用的是docker环境,用主机浏览时,无法使用web界面正确安装wordpress,因此,倘若你也遇到后台登录账号无法登录的问题,可以通过如下方法添加测试账号,用于登录网站后台

mysql> INSERT INTO `wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_activation_key`, `user_status`, `display_name`) VALUES ('4', 'demo', MD5('demo'), 'tester', '[email protected]', 'http://www.justcoding.iteye.com/', '2014-03-14 00:00:00', '', '0', 'tester');  
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '4', 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');  
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '4', 'wp_user_level', '10');  
Query OK, 1 row affected (0.05 sec)

当然,直接导入安装并设置好了的mysql文件会更加方便。
3.6 mysql主从复制
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第9张图片

1.分别修改mysql-master,mysql-slave的/etc/my.cnf
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第10张图片
在这里插入图片描述

2.在master节点配置从节点账号

mysql> grant replication slave on . to rep@‘172.18.0.202’ identified by ‘123’;
在这里插入图片描述
查看主节点信息
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第11张图片
3.在slave节点配置主节点信息
mysql> CHANGE MASTER TO MASTER_HOST=‘172.18.0.201’, MASTER_USER=‘rep’, MASTER_PASSWORD=‘123’, MASTER_LOG_FILE=‘mysql-bin.000001’, MASTER_LOG_POS=120;
mysql> start slave;
Mysql> show slave status;
在这里插入图片描述
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第12张图片
在slave节点查看数据库,可以看到已经同步。
docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第13张图片

3.7 zabbix

3.7.1 下载安装zabbix

//配置镜像

#  rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
//安装
# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent

3.7.2 .初始化mysql数据库

//创建数据库并授权
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '123456';
//初始化数据库
# zcat /usr/share/doc/zabbix-server-mysql-4.2.3/create.sql.gz | mysql -uzabbix -p123456 zabbix

3.7.3 配置数据库

//在zabbix_server.conf中编辑数据库配置

# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=123456

3.7.4 启动

//启动Zabbix Server进程
# systemctl start zabbix-server
编辑Zabbix前端的PHP配置
#vi /etc/httpd/conf.d/zabbix.conf 
php_value date.timezone Asia/Shanghai
#systemctl restart httpd 
在主机浏览器访问http://zabbix IP/zabbix
在其他服务器安装zabbix-client,并设置相关配置

docker搭建高可用与负载均衡(二)nginx+apache+php+mysql主从复制+NFS+zabbix监控系统_第14张图片

3.8 wordpress负载均衡部署

鉴于以上安装流程中出现的问题,建议在单台服务器上先完成wordpress的安装,导出数据库,以安装好的wordpress容器提交为镜像,然后创建新的容器。拷贝导出的数据库文件,导入到mysql-master上,并在mysql-master上配置给web服务器的权限。

5.总结

在构建高可用与负载均衡的web集群过程中,重要的是掌握其中原理,并明白各个部分的功能。负载均衡用来分担网络流量,高可用用来增强安全和可靠性。对数据库的主从复制配置则为数据安全提供了保障。NFS可以提高服务器的利用率,同时也方便资源的管理。
Web集群的搭建可以帮我们更好的理解软件功能和设计模式。Wordpress作为一款出色的web框架软件,学习它的集群搭建是非常有必要的。

你可能感兴趣的:(linux)