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系統,系統搭建如圖所示:
在這裏插入圖片描述

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"
<Directory "/var/www/html/wordpress">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

3.3.4 PHP版本問題和wordpress的安裝探索

在這裏插入圖片描述
升級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的安裝工作。
在這裏插入圖片描述

3.4 NFS配置

在這裏插入圖片描述

3.4.1 宿主機安裝nfs,配置共享目錄

  1. 安裝配置nfs

    #yum install nfs-utils //使用yum方式安裝nfs
    #vim /etc/sysconfig/nfs
    #systemctl start rpcbind //啓動rpcbind服務,查看監聽端口

在這裏插入圖片描述
在這裏插入圖片描述

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,需要修改數據庫中的一些參數
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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主從複製
在這裏插入圖片描述

1.分別修改mysql-master,mysql-slave的/etc/my.cnf
在這裏插入圖片描述
在這裏插入圖片描述

2.在master節點配置從節點賬號

mysql> grant replication slave on . to rep@‘172.18.0.202’ identified by ‘123’;
在這裏插入圖片描述
查看主節點信息
在這裏插入圖片描述
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;
在這裏插入圖片描述
在這裏插入圖片描述
在slave節點查看數據庫,可以看到已經同步。
在這裏插入圖片描述

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,並設置相關配置

在這裏插入圖片描述

3.8 wordpress負載均衡部署

鑑於以上安裝流程中出現的問題,建議在單臺服務器上先完成wordpress的安裝,導出數據庫,以安裝好的wordpress容器提交爲鏡像,然後創建新的容器。拷貝導出的數據庫文件,導入到mysql-master上,並在mysql-master上配置給web服務器的權限。

5.總結

在構建高可用與負載均衡的web集羣過程中,重要的是掌握其中原理,並明白各個部分的功能。負載均衡用來分擔網絡流量,高可用用來增強安全和可靠性。對數據庫的主從複製配置則爲數據安全提供了保障。NFS可以提高服務器的利用率,同時也方便資源的管理。
Web集羣的搭建可以幫我們更好的理解軟件功能和設計模式。Wordpress作爲一款出色的web框架軟件,學習它的集羣搭建是非常有必要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章