Nginx架构篇(三);LNMP架构实现discuz和wordpress搭建:MySQL多实例、主主及主从复制、读写分离及nfs网站代码集中式管理(后续可以为数据库添加MHA,DRBD)


本文架构图:
在这里插入图片描述

注意:此图的NFS还应该与Nginx相连!即在Nginx的html上也应该挂载NFS的共享目录

一、环境搭建及主从复制基础知识

1、Nginx安装教程:https://blog.csdn.net/weixin_44571270/article/details/102887048
2、PHP安装教程:https://blog.csdn.net/weixin_44571270/article/details/103223557
注意:php7相较php5版本发生了很大的变化,不再支持mysqli_connect函数,所以在此处建议安装使用php5版本。否则discuz和wordpress会安装不上。

3、yum安装MySQL多实例安装教程:https://blog.csdn.net/weixin_44571270/article/details/103368000
4、主从复制配置及知识:https://blog.csdn.net/weixin_44571270/article/details/103148755


确认自己所有的Nginx、PHP、MySQL已经完成基本的安装!
下面就是各种功能的实现:


二、NFS服务器的配置

1、新建共享文件的目录

mkdir /webapps

2、安装NFS服务

yum install nfs nfs-utils -y

注意:安装了上面这个也会自动安装RPC。

3、从外部上传wordpress、discuz
在mac终端上输入下面命令:

 scp /Users/shijiandingyiqingchun/Desktop/Discuz_X3.2_SC_UTF8.zip 172.16.193.206:/data/
 scp /Users/shijiandingyiqingchun/Desktop/wordpress-5.0.2-zh_CN.tar.gz 172.16.193.206:/data/

注意:
(1)不能在虚拟机上scp到物理机上拿文件,物理机很有可能关闭了ssh端口的,导致scp失败。所以我们需要到物理机的终端上scp,上传文件到虚拟机中,这样就好了。
(2)这样scp复制,需要在虚拟机中创建一个用户名为shijiandingyiqingchun,还需要passwd shijiandingyiqingchun,修改它的密码,scp会让你输入密码,就是这个passwd这个你修改的密码。

4、解压缩两个文件,并移到共享文件目录下
(1)解压

unzip Discuz_X3.2_SC_UTF8.zip
tar xvf wordpress-5.0.2-zh_CN.tar.gz 

(2)移到共享目录下
解压后的wordpress可以直接移:

mv wordpress /webapps/

解压后的discuz不能全部移到共享文件目录下:

mv upload/* /webapps/ 

4、编辑exports文件
添加以下内容:

/webapps/ 172.16.193.* [rw,all_squash]

5、开启NFS服务

systemctl start nfs

注:
(1)如果修改了exports文件,就可以使用exportfs -r不需要重新启动nfs。
(2)开启了NFS服务,会自动先开启RPC服务,然后再开启NFS。

三、Nginx服务器的配置

1、编辑主配置文件nginx.conf:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream server_pool{
        server 172.16.193.201:9000;
        server 172.16.193.202:9000;
    }

**discuz**
    server {
        listen       8080; //用基于端口的虚拟主机
        server_name  localhost;
        location / {
            root   /mnt/www.discuz.com/;
            index  index.html index.php;
        }
    location ~*\.php$ {
        root /mnt/www.discuz.com;
        fastcgi_pass server_pool;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

**wordpress**
    server {
        listen       80; //基于端口的虚拟主机
        server_name  localhost;
        location / {
            root   /mnt/wordpress;
            index  index.html index.php;
        }
        location ~*\.php$ {
                root /mnt/wordpress;
                fastcgi_pass server_pool;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2、安装NFS服务,挂载共享文件目录

yum install nfs nfs-utils -y
mount 172.16.193.206:/webapps/ /mnt/

四、PHP服务器需要做的配置(两个PHP都是一样的配置)

1、安装NFS服务

yum install nfs nfs-utils -y

2、挂载共享文件目录

mount 172.16.193.206:/webapps/ /mnt/

3、查看是否挂载上

df -hT

4、修改监听地址为本地ip
在这里插入图片描述注意:不能写127.0.0.1
5、安装php-mysql

yum install php-mysql -y

这个特别重要,没有这个就不能实现对数据库的连接。
在这里插入图片描述注:记录这个目录:/usr/lib64/php/modules
这个目录就是安装php-mysql产生的。

6、现在就已经可以看到效果了
discuz论坛安装界面:
在这里插入图片描述
wordpress:
在这里插入图片描述

五、MySQL多实例:主主、主从复制,读写分离

有了主从复制,为什么还要采用主主复制?
答:MYSQL主从复制的弊端是一旦主库宕机,网站代码将数据库配置修改为从库,从库再更新数据,主从关系会破坏哦,企业生产环境一般采用主主模式+DRBD来保证数据的完整性。主主复制还可以分担写的压力。主主复制也可以做读写分离,只不过主库一般写压力都很大了,所以不建议再把读压力分担给主库。

1、打开三个终端,分别登录三个端口的数据库
在这里插入图片描述2、编辑3307、3308和3309的my.cnf文件

vim /etc/my.cnf.d/my3307.cnf

修改后为:

[client]
port = 3307
socket = /data/mysql/3307/mysql3307.sock
[mysqld]
server-id=1 //这个必须不一样
log-bin=mysql-bin
datadir=/data/mysql/3307/
port = 3307
socket = /data/mysql/3307/mysql3307.sock

my3308.cnf和my3309.cnf文件的配置照着上面这个文件修改即可。


先给3307数据库和3308数据库做主主复制


3、创建连接信息
(1)相互查看log_pos及其log-bin文件名
3307:
在这里插入图片描述
3308:
在这里插入图片描述
(2)创建连接信息
3307:

change master to master_host='172.16.193.203',master_user='tongbu',master_port=3308,master_password='mysql',master_log_file='mysql-bin.000001',master_log_pos=474;

3308:

change master to master_host='172.16.193.203',master_user='tongbu',master_port=3307,master_password='mysql',master_log_file='mysql-bin.000001',master_log_pos=549;

4、相互授权访问
3307:

MariaDB [(none)]> grant replication slave on *.* to 'tongbu'@'172.16.193.%' identified by 'mysql';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;

3308:

MariaDB [(none)]> grant replication slave on *.* to 'tongbu'@'172.16.193.%' identified by 'mysql';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;

5、查看是否成功
在这里插入图片描述
在这里插入图片描述


再给3307数据库和3309数据库做主从复制


注:配置略!不相互声明为主的主主就是主从,单方声明!

为什么有了主主复制还要主从复制呢?
主从复制过后,再次确保数据的完整性,为数据做备份,还可以做读写分离,两个主库写,一个从库做读操作,真是再好不过了!


3307数据库和3309数据库做读写分离


注:电脑足够强大的情况下,建议安装mysql-proxy的这台机器单独放在一个服务器上。

mysql-proxy在本实验中架构图中的位置需要明确
NFS上的网站代码中连接数据库的文件,不要再写数据库的地址,需要写mysql-proxy的服务器的4040端口,网站运行时,php找mysql-proxy所在的服务器的4040端口,然后mysql-proxy再把写请求分配给主库,读请求分配给从库。

//wordpress的连接数据库文件:
[root@NFS_SERVER ~]# vim /webapps/wordpress/wp-config.php
//discuz的连接数据库文件
[root@NFS_SERVER ~]# vim /webapps/www.discuz.com/config/config_global.php 

实现MYSQL读写分离可以基于第三方插件,也可以通过开发修改代码实现。
比较:
第三方插件实现,效率不如修改代码的好,但是修改代码实现读写分离需要比较高的开发功底!一般中小企业都适用第三方插件,大型企业才会修改代码去实现读写分离!

下面我们就使用mysql-proxy这个中间件,实现读写分离:

1、下载mysql-proxy

wget -O /usr/local/mysql-proxy.tar.gz http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz

2、解压mysql-proxy

cd /usr/local/
tar xvf mysql-proxy.tar.gz
mv mysql-proxy-0.8.4-linux-el6-x86-64bit/ mysql-proxy/

3、启动mysql-proxy

/usr/local/mysql-proxy/bin/mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="172.16.193.203:3307" --proxy-read-only-backend-addresses="172.16.193.203:3309" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"

上述命令中的admin用户及其密码,登录4041端口的管理服务时需要使用。

参数说明:

--help-all   				          :获取全部帮助信息;
--proxy-address=host:port 	          :代理服务监听的地址和端口,默认为4040--admin-address=host:port  	          :管理模块监听的地址和端口,默认为4041--proxy-backend-addresses=host:port   :后端mysql服务器的地址和端口,即为主库地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口,即为从库地址和端口;
--proxy-lua-script=file_name           :完成mysql代理功能的Lua脚本;
--daemon  						      :以守护进程模式启动mysql-proxy;
--keepalive 					 	  :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name 	     :日志文件名称;
--log-level=level 					  :日志级别;
--log-use-syslog 					  :基于syslog记录日志;
--plugins=plugin					  :在mysql-proxy启动时加载的插件;
--user=user_name  				      :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name :默认使用的配置文件路径,其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling 				  :禁用profile;
--pid-file=/path/to/pid_file_name 	  :进程文件名;

查看是否启动:
在这里插入图片描述

4、登录管理服务4041端口

关闭防火墙后执行以下操作:

 mysql  -h172.16.193.203  -uadmin  -padmin  -P 4041
 //管理服务,登录使用的用户名和密码是启动命令时指定的

在这里插入图片描述注:在这里可以看到3307的主库状态时up的,从库还是未知的。我们接下来需要通过操作4040端口,让它变成up。

5、登录4040端口的代理服务

注:代理服务主要是接受网站请求的,所以网站代码中需要改成4040(修改内容请看下面第五步)。
(1)执行查询命令;
执行show databases;直到在4041上的从库状态从unknown变成up为止,这个变可能需要点时间,耐心等,几分钟吧。
注:变成up就说明读写分离成功了,如下。
在这里插入图片描述怎么确认,这个读不是从主库读,而是从从库读到的呢?请看下步!

(2)登录从库,在从库创建test数据库,且创建www表,并插入信息。

[root@MySQL-SERVER ~]# mysql -uroot  -p123456 -S /data/mysql/3309/mysql3309.sock
//这里也可以是其他用户,但是这个用户一定不能是本地用户,必须是MySQL允许可以远程登录的用户

在这里插入图片描述注:在从库中创建的这个信息,是不会同步到主库的是吧!我们如果在4040端口上能够查询到这个信息,是不是就能说明是在从库上读的了!
(3)在4040上看是否能成功读到主库特有信息。
在这里插入图片描述大家现在就放心读写分离是真的成功了吧!

6、实现网站的读写分离

当主从库全部都是up状态时,读写分离起来,再改网站代码,实现网站读写分离。
以wordpress为例:
在这里插入图片描述 :其他信息不变,只是把MySQL主机变成MySQL-proxy所在的服务器的ip和4040端口。

六、安装discuz和wordpress的准备工作

在3307、3308、3309数据库下配置如下(赋予权限):

Warning:

下面所有的'discuz'@'172.16.193.*',其中的'*'全部改成'%',就是这个星号害我找了三天的错误,全都是在php上找错误去了!!

在这里插入图片描述注:3307和3308、3309配置一样。因为如果做了高可用,有库不能工作,它们之间可以相互代替完成工作。所以权限都要给。

创建discuz和wordpress所需要的库:

MariaDB [(none)]> create database discuz charset=utf8;
//创建库discuz,且字符集为utf8

在这里插入图片描述

MariaDB [(none)]> create database wordpress;
//因为安装wordpress没有要字符集,所以这里我们就不要设置了!

七、安装wordpress、discuz

discuz安装:

1、
在这里插入图片描述2、
在这里插入图片描述3、
在这里插入图片描述4、
在这里插入图片描述5、
在这里插入图片描述

wordpress安装:

1、
在这里插入图片描述
2、
在这里插入图片描述3、
在这里插入图片描述4、
在这里插入图片描述5、
在这里插入图片描述5、
在这里插入图片描述

发布了162 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/103394005