LNMP+HAproxy+Keepalived+NFS集群架构

keepalived+haproxy搭建LNMP架构并做数据同步 准备环境 # 数字8表示CentOS8系统数字7表示CentOS7系统(建议使用相同的系统,比如CentOS8) 虚拟VIP:172.31.0.188 172.31.0.27 keepalived + haproxy master 172.31.0.37 keepalived + haproxy backup 172.31.0.7 nginx + php-fpm 172.31.0.17 nginx + php-fpm 172.31.0.8 mysql-server8.0 master 172.31.0.18 阅读详情



规划与简述

 本章会和大家一起搭建一个简单的站点架构,从用户请求开始,到HAproxy代理调度,再到后端LNMP的交互工作,mysql数据库主从复制,以及NFS文件共享实现数据同步。具体结构如下图所示:
在这里插入图片描述
 在实验开始前,先简单介绍一下上图的工作流程和结构功能。大家都有过上网查资料、看新闻、购物等经历,我们随手点开一个网站,浏览器会迅速给我们响应出站点内容,其实在这瞬间的一两秒内,是一个很复杂的后端处理过程。
 如上图所示,用户的请求报文首先会通过internet传送过层层路由到达站点外围的防火墙,通过防火墙的规则到达haproxy和keepalived组成的负载均衡调度集群,haproxy负责把用户的请求通过事先设好的调度规则和调度算法转发到后端真实web服务器,haproxy最好是有两台或以上组成,但是用户访问的站点地址通常只能绑定在唯一的一台服务器上,如果两台haproxy都绑定相同的站点地址就会造成IP地址冲突,这时使用keepalived服务就能解决这个问题,我们把站点地址设定为一个虚拟IP,我们称之为VIP,通过keepalived服务把VIP规则添加在这两台机器上,但是在两台服务器都正常运行的情况下,只会有一台服务器拥有这个VIP并对外提供服务,当这台机器或haproxy进程出现故障的时候,VIP会立刻飘动到另一台机器上,继续对外提供服务,这样就很好地解决了单点失败问题,不至于当haproxy服务宕机整个网站就挂了。当请求通过haproxy调度到后端的web服务器后,nginx会根据用户的请求提供相应的服务,如果是静态请求nginx自己就能提供服务,如果是动态请求就会通过fastcgi协议连接php,如果有数据请求php解释器又会通过haproxy四层负载连接数据库。还有就是数据同步,比如用户的第一次请求被调度到第一台web服务器,用户进行了一些操作,比如添加了一件商品到购物车或发表了一张图片,但是过了几分钟用户第二次请求却被调度到了另一台web服务器,这时她会发现刚刚添加的购物车和发表的图片都不见了,这是因为两台web服务器的数据不同步导致的,为了解决这个问题,这里的站点php程序和数据包是单独放置在一台服务器上的,通过NFS服务挂载到两台web服务器,这时候两台web服务使用的数据程序时同一个文件,就不会再发生上述请求不一致的问题了(当然还有更好的方式redis数据库实现session共享,这个以后会和大家共享)。另外为了用户数据的安全,站点通常会实时备份同步数据,这样不至于如果NFS服务器数据丢失了,数据无法就找回的问题,同样,最后的mysql主从复制也是数据同步和备份,毕竟,数据是无价的……
 哈哈,啰嗦了这么多,大家可以跳过上面的简述的…

搭建HAproxy+Keepalived集群

环境准备:两台linux,我们简称HK1和HK2,系统censtos7.7 IP:192.168.131.18、192.168.131.28

编译安装HAproxy

源码包下载地址:http://www.haproxy.org/download/
HAproxy安装依赖lua包,实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio deJaneiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由于centos7系统自动的lua版本过低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,这里我是使用的lua-5.3.5和haproxy-2.0.8,过程如下:

#先在HK1上安装配置
cd /usr/locate/src        //安装位置,可自定义
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz    //下载lua包
yum install gcc libtermcap-devel ncurses-devel libevent-devel readline-devel   //安装相关依赖包
cd lua-5.3.5
make linux test    //执行此命令即可安装lua

root@Centos7-IP18:src]#lua-5.3.5/src/lua -v           //检测编译安装的lua版本,确认已编译安装了Lua 5.3.5 
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

ln -s /usr/local/src/lua-5.3.5/src/lua /usr/bin/lua  //可以创建软连接,替换系统自带的版本

//编译安装haproxy-2.0.4.tar.gz,同样是在/usr/locate/src/下
//首先先安装相关依赖包
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
tar xvf haproxy-2.0.4.tar.gz
 
cd haproxy-2.0.8
//编译,指定用到的lua包路径,已经要安装的路径
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy     //执行安装

root@realcts7:local]#haproxy/sbin/haproxy -v       //验证haproxy版本
HA-Proxy version 2.0.8 2019/10/23 - https://haproxy.org/

cp /usr/local/haproxy/sbin/haproxy /usr/sbin/      //复制到sbin下,变为默认命令
root@Centos7-IP18:local]#which haproxy
/usr/sbin/haproxy

#编写HAproxy启动脚本
vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid 
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

#准备配置文件
useradd -s /sbin/nologin -u 2000 haproxy    //创建haproxy账号
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
    global           //全局参数
    maxconn 100000   //定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
    chroot /usr/local/haproxy       //锁定运行目录,编译安装建议一定打开
    stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
    uid 2000         //此处也可以写uid、group,和上面创建的账号保存一致
    gid 2000
    daemon           //以守护进程的方式运行
    #nbproc 4            //开启的haproxy进程数,与CPU保持一致,如果你的CPU是2核:nbproc 2
    #cpu-map 1 0                                                              cpu-map 1 0
    #cpu-map 2 1                                                              cpu-map 2 1
    #cpu-map 3 2         //如果是四核把注释的全打开
    #cpu-map 4 3
    pidfile /var/lib/haproxy/haproxy.pid
    log 127.0.0.1 local3 info    //日志级别
    
    defaults
    option http-keep-alive      //开启与客户端的会话保持
    option forwardfor           //透传客户端真实IP至后端web服务器
    maxconn 100000
    mode http           //默认工作模式,mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
    timeout connect 300000ms    //#客户端请求到后端server的最长连接等待时间(TCP之前)
    timeout client 300000ms     //客户端请求到后端服务端的超时超时时长(TCP之后),超时会报502错误
    timeout server 300000ms     //与客户端的最长非活动时间,建议设长一些
    
    listen stats                //设定一个状态页面
    mode http
    bind 0.0.0.0:9999           //状态监听地址和端口
    stats enable
    log global
    stats uri /haproxy-status        //登录状态页面uri
    stats auth haadmin:q1w2e3r4ys    //登录状态页面的账户和密码

#上面的文件准备完毕后启动haproxy
mkdir /var/lib/haproxy
chown haproxy.haproxy /var/lib/haproxy/ -R   
 
systemctl start haproxy        //开启haproxy
systemctl enable haproxy       //设为开机自启
systemctl status haproxy       //查看运行状况

在这里插入图片描述
正常启动后的haproxy状态页面:
在这里插入图片描述


编译安装keepalived

keepalived编译安装相对于haproxy来说相对简单,这里使用的是较新的keepalived-2.0.18

cd /usr/local/src/
wget https://keepalived.org/software/keepalived-2.0.18.tar.gz
tar -xvf keepalived-2.0.18.tar.gz -C /usr/local/src/
yum install -y gcc libnfnetlink-devel libnfnetlink ipvsadm  libnl libnl-devel libnl3 libnl3-devel lm_sensors-libs net-snmp-agent-libs net-snmp-libs  openssh-server openssh-clients  openssl openssl-devel automake iproute
cd keepalived-2.0.18/
./configure --prefix=/usr/local/keepalived --disable-fwmark
make && make install

安装完毕后我们开启如下图所示的界面,其中只要没有error,就是正常安装:
在这里插入图片描述

#准备启动和配置文件
cp /usr/local/src/keepalived-2.0.18/keepalived/etc/init.d/keepalived.rh.init /etc/sysconfig/keepalived.sysconfig
cp /usr/local/src/keepalived-2.0.18/keepalived/keepalived.service  /usr/lib/systemd/system/
cp  /usr/local/src/keepalived-2.0.18/bin/keepalived  /usr/sbin/

mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {             //发生故障切换时邮件发送的对象,可以按行区分写多个
     admin@l63.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1        //邮件服务器IP,自定义即可
   smtp_connect_timeout 30          //
   router_id HK1              //虚拟路由id,自定义即可,主从不要相同
}
vrrp_instance VI_1 {                //虚拟路由配置
    state MASTER                    //当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
    interface ens33                 //绑定为当前虚拟路由器使用的物理接口
    virtual_router_id 80            //当前虚拟路由器惟一标识,范围是0-255,主从必须要一致
    priority 100                    //当前物理节点在此虚拟路由器中的优先级;范围1-254,一般主的优先级大于从
    advert_int 1                    //rrp通告的时间间隔,默认1s
    unicast_src_ip 192.168.131.18   //指定单播的源IP,即本机地址
    unicast_peer {                  //指定单播的对方IP,即另一台keepalived服务地址
        192.168.131.28
    }

    authentication {               //认证机制
        auth_type PASS             //认证类型,主从必须一致
        auth_pass 1111             //认证密码,主从必须一致
    }
    virtual_ipaddress {            //虚拟IP地址,网卡接口要和上面的interface一致
        192.168.131.249/16 dev ens33 label ens33:0  
    }
} 

systemctl start keepalived        //正常配置完成后,开启keepalived服务

检测keepalived运行状况:
在这里插入图片描述
检测绑定的虚拟IP:
在这里插入图片描述
 在另一台linuxHK2上同样编译安装haproxy和keepalived,步骤和上面的操作都是一样的,唯一不同的就是keepalived的配置文件,需要改动几处即可:

! Configuration File for keepalived
global_defs {
   notification_email {
     admin@163.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id HK2
}

vrrp_instance VI_1 {
    state BACKUP                 //前一台是master,这一台设为backup
    interface ens33
    virtual_router_id 80         //虚拟路由id,要和master保证一致
    priority 80                  //优先级比master要低一些
    advert_int 1
    unicast_src_ip 192.168.131.28  
    unicast_peer {
        192.168.131.18
    }

    authentication {             //认证要保持一致,否则认证会失败
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.131.249/24 dev ens33 label ens33:0   //虚拟IP也要一样
    }
}

开启keepalived服务:systemctl start keepalived
在这里插入图片描述
这时候我们可以测试一下keepalived服务是否可以正常运行实现主从之间虚拟IP飘动绑定,因为HK1的keepalived服务优先级比HK2高,在同时开启keepalived服务运行下虚拟IP是绑定在HK1上的,现在我们手动把HK1的keepalived服务停止或者之间将HK1关机,我们观察HK2的ip变化,会发现虚拟ip会立刻漂浮到了HK2上
在这里插入图片描述
 到这里我们就搭建好了HAproxy和Keepalived服务,但是由我们前面的规划图所示,这里可以先把后端的web服务代理调度规则和四层负载连接mysql数据库的规则添加在haproxy的配置文件里,很简单只需要几行代码而已:

vim /etc/haproxy/haproxy.cfg     //在上面写的配置文件最后添加下面代码,HK1和HK2添加一致
listen web_real-80          //代理监听web服务段
  bind 192.168.131.149:80   //指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中,这里用定义的虚拟IP地址
  mode http    //工作模式
  log global   //日志调用项,日志模式在上面defaults定义
  balance roundrobin    //调度算法,以权重比例轮询
  server real1 192.168.131.38:80 check weight 1 addr 192.168.131.38 port 80 inter 3s fall 3 rise 5    //定义后端真实服务器,real2为自定义的server name
  server real2 192.168.131.58:80 check weight 2  //check为健康检查,weight为权重
  
listen mysql_3306            //代理监听mysql数据库段
  bind 192.168.131.249:3306
  mode tcp
  log global
  server 192.168.131.78 192.168.131.78:3306  check addr 192.168.131.78 port 3306 inter 3000 fall 2 rise 5

配置完成后重启haproxy服务,再来查看haproxy状态页面,会看见我们刚刚定义的后端web服务和mysql服务,但是因为我们还没有配置,状态显示红色
在这里插入图片描述


源码编译Nginx+PHP web服务

服务环境:两台linux系统,分别起名NP1、NP2,NP1IP:192.168.131.38、NP2IP:192.168.131.58
软件安装包:nginx-1.16.1.tar.gz、php-7.3.10.tar.xz

编译安装nginx

yum install gcc pcre-devel openssl-devel zlib-devel   //安装相关依赖包
useradd -s /sbin/nologin nginx -u 2000                //创建nginx账户
cd /usr/local/src                                     
tar xvf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure \                 //执行环境检测并生成Makefile文件
--prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

make && make install                   //安装编译

上面的操作执行无误后,nginx就安装完毕了,在NP2上执行相同的安装步骤即可。在正常启动nginx前,我们还需要修改一下配置文件:

vim /apps/nginx/conf/nginx.conf
	user  nginx nginx;                         //把nginx服务用户和组改为我们创建的nginx
	include /apps/nginx/conf/conf.d/*.conf;    //这项加在http{}之内,可以单独在conf/conf.d/下创建单独的配置文件

mkdir /apps/nginx/conf/conf.d                  //创建conf.d文件夹
vim /apps/nginx/conf/conf.d/abc.conf           //我们创建独立的配置文件,自定义命名,但是必须要以conf结尾
	server {                                   //下面就是站点配置文件
        listen 80 default_server;              //nginx监听端口
        server_name localhost;              

        location / {
           root /tmp/nginx/wordpress;          //站点默认访问的根路径
           index index.php index.html index.htm;
           if ($http_user_agent ~ "ApacheBench|WebBench|TurnitinBot|Sogou web
              spider|Grid Service") {
              #proxy_pass http://www.baidu.com;
              return 403;
           }
        }
        location ~ \.php$ {
           #root /tmp/nginx/wordpress;
           fastcgi_pass 127.0.0.1:9000;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME /tmp/nginx/wordpress$fastcgi_script_name;
           include fastcgi_params;
        }
        location ~ ^/(pm_status|ping)$ {              //状态页面,后面测试可以用到
           include fastcgi_params;
           fastcgi_pass 127.0.0.1:9000;
           fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
        }
}

#nginx服务相关指令
/apps/nginx/sbin/nginx                //执行nginx脚本,开启nginx服务
/apps/nginx/sbin/nginx -s             //-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
/apps/nginx/sbin/nginx -s stop        //关闭nginx服务
/apps/nginx/sbin/nginx -s reload      //加载配置文件
/apps/nginx/sbin/nginx -v             //查看版本编号
/apps/nginx/sbin/nginx -V             //显示版本和编译参数
/apps/nginx/sbin/nginx -t             //检测conf配置文件语法是否错误

一切配置完毕后,可以检测一下配置文件语法是否有错,无报错后开启nginx服务,系统会开启相关进程并打开80端口
在这里插入图片描述
在这里插入图片描述

源码编译php

 同样在/usr/local/src/下

cd /usr/loacl/src
yum install -y libxml2-devel bzip2-devel libmcrypt-devel
tar xvf php-7.3.10.tar.xz
cd php-7.3.5
./configure --prefix=/apps/php \								#执行配置选项
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--enable-mbstring \
--enable-xml \
--enable-sockets \
--enable-fpm \
--enable-maintainer-zts \
--disable-fileinfo

make && make install

//配置:
cd php-7.3.10
cp php.ini-production /etc/php.ini              //复制生成文件模板改名php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  //复制启动文件并改名
chmod +x /etc/init.d/php-fpm                    //为启动文件添加执行权限

cd /apps/php/etc
cp php-fpm.conf.default php-fpm.conf            //复制模板配置文件并改名
cp php-fpm.d/www.conf.default php-fpm.d/www.conf
vim wwwconf
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
…………

service php-fpm start                           //启动PHP服务,正确开启会打开9000端口

 正常安装完php后,整个web服务也基本是搭建OK了,NP1和NP2几乎是相同的安装步骤和配置,建议把NP2的域名自定义改一下,其他的没什么需要改动的,正常安装后系统会同时打开80和9000端口:
在这里插入图片描述


配置mysql数据库连接和主从复制

首先安装数据库,使用源码编译和yum安装都可以,源码编译的操作我在以前的博客中有详细介绍mysql数据库源码编译安装
这里为方便我是使用yum安装mariadb,Server version: 10.3.11-MariaDB MariaDB Server

安装与连接数据库
//安装数据库
yum install -y mariadb-server mariadb
systemctl start mariadb               //开启数据库服务,会打开3306端口
mysql_secure_installation             //设定数据库密码
mysql -p'密码'                        //登录数据库
create database wordpress;           //创建站点数据库
grant all privileges on wordpress.* to "wordpress"@"192.168.131.%" identified by "password";    //创建并授权连接站点数据库的用户,password是自定义的密码
flush privileges

这时候我们在观察haproxy状态页面,会发现后端数据库项变为了绿色,即表示haproxy检测到了mysql数据库,并处于正常连接配置状态:
在这里插入图片描述
另外我们还可以找一台机器通过haproxy的vip和我们在数据库中授权的账户测试一下数据库是否可以连接
在这里插入图片描述

实现主从复制

 由上图的规划,我们设定主数据库master为192.168.131.78,从数据库slave为192.168.131.88

#在master上
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]]
log_bin        //打开二进制日志
server_id=8    //自定义一个server_id

mysql -p       //-p后直接跟密码,登录数据库
grant replication slave on *.* to 'tom'@'192.168.131.88' identified by '12345';       //创建数据同步账号

mysqldump   --all-databases  --single_transaction --flush-logs --master-data=2 --lock-tables > /root/backup.sql  //导出master上的所有数据库
scp /root/backup.sql root@192.168.131.88:/root   //复制到slave上
head -n 30 backup.sql 

在这里插入图片描述

#在slave上
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server_id=10      //为当前节点设置一个全局惟一的ID号,不要和master一样
read_only=ON     //最好设置数据库只读

mysql < /root/backup.sql  //将master复制过来的备份文件导入数据库
mysql -p                  //登录数据库
#下面的代码是填写master的IP地址,在master上创建的授权账号密码,以及我们记录的日志名称和位置
CHANGE MASTER TO MASTER_HOST='192.168.131.78',MASTER_USER='tom',MASTER_PASSWORD='12345',MASTER_LOG_FILE='mariadb-bin.000006', MASTER_LOG_POS=389;
start slave;  //开启slave线程

show slave status\G;     //查看slave线程状态

在这里插入图片描述
 主从复制到处就搭建好了,如果你不是太确定的话,可以在master上创建一个库,然后立刻在slave上面查看此库有没有被同步过来……


部署wordpress站点程序实现NFS网络共享

 安装实验规划,我们把wordpress站点程序部署到NFS服务器上,通过网络挂载到后端的web服务器NP1和NP2,这里使用的wordpress程序包为wordpress-5.2.3

部署并配置wordpress
#解压下载好的wordpress程序包
unzip wordpress-5.2.3-zh_CN.zip
cp -r wordpress /data/devops/     //我把解压后的wordpress复制到/data/devops/下,你可以自定义路径
cd /data/devops/wordpress
cp wp-config-sample.php wp-config.php    //把模板文件改名

vim wp-config.php    #更改配置文件里的下面这几段连接数据库行,其他不用动
/** MySQL数据库名 */
define( 'DB_NAME', 'wordpress' );    //上面数据库中创建的站点数据库名
/** MySQL数据库用户名 */           
define( 'DB_USER', 'wordpress' );   //授权访问该站点库的用户
/** MySQL数据库密码 */
define( 'DB_PASSWORD', 'password' );    //你当时授权是自定义的密码
/** MySQL主机 */
define( 'DB_HOST', '192.168.131.249' );   //这里填写haproxy的vip,因为我们在haproxy上面配置了数据库的tcp代理
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET', 'utf8' );
/** 数据库整理类型。如不确定请勿更改 */
define( 'DB_COLLATE', '' );

setfacl -R -m u:2000:rwx wordpress        //2000为web服务器上nginx账户的uid,给nginx一个acl权限
root@localhost:devops]#getfacl wordpress/
# file: wordpress/
# owner: root
# group: root
user::rwx
user:2000:rwx
group::r-x
mask::rwx
other::r-x


 这样我们的wordpress站点程序文件就准备好了,然后我们需要把它通过NFS服务挂载到web服务器上去

实现NFS网络共享

 想启用NFS网络共享服务,需要安装软件包nfs-utils,还要确保NFS服务器和两台web服务器时间同步、网络通顺等。

#开始配置nfs共享
yum -y install nfs-utils
vim /etc/exports     //把共享规则下入到此文件下
#下面的代码意思是:首先是存放到共享的wordpress程序文件的目录路径,*共享给所有主机,生产环境下要具体写虚共享的IP地址,rw是用读写权重,anonuid=2000,anongid=2000,all_squash是全压榨为UID为2000的nginx账户,就是我们上面设定acl账户的权限
/data/devops      *(rw,anonuid=2000,anongid=2000,all_squash)   //只需这一行代码,保存退出

exportfs -r      //加载配置文件是共享生效
root@localhost:~]#exportfs -v    //查看共享
/data/devops  	<world>(sync,wdelay,hide,no_subtree_check,anonuid=2000,anongid=2000,sec=sys,rw,root_squash,all_squash)

systemctl start nfs    //开启nfs服务

查看nfs服务运行状态:
在这里插入图片描述
 然后再分别在web服务器NP1和NP2上挂载此nfs共享:

#由我们在nginx配置文件里写好的默认站点访问路径,我们需要把wordpress挂载到/tmp/nginx/下
yum install -y nfs-utils
showmount -e 192.168.131.8     //查看NFS服务器共享的内容,后面的ip为NFS服务器的ip
mount -t nfs 192.168.131.8:/data/devops /tmp/nginx      //用mount只是临时挂载,如果想要永久挂载需要写入到fstab文件里
vim /etc/fstab   //打开fstab文件,添加下面一行代码
192.168.131.8:/data/devops  /tmp/nginx  nfs  defaults        0 0

[root@localhost ~]# ll /tmp/nginx/    //此时nginx文件下就会看见wordpress目录
total 105
drwxrwxr-x. 5 root root  4096 Nov  8 19:43 wordpress

 分别在NP1和NP2上执行上述相同的命令操作即可挂载站点文件。


inotify+rsync实现数据实时同步

inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
实现inotify软件包:inotify-tools,sersync,lrsyncd

要实现数据的实时同步,我们利用监控服务inotify监控同步数据服务器目录中信息的变化,当发现目录中数据产生变化时,就利用rsync服务推送到备份服务器上。这里的同步数据服务器为NFS服务器,我们把用以备份的服务器称为BK(backup)服务器.
查看NFS服务器内核是否支持inotify:

#在NFS服务器上
ls -l /proc/sys/fs/inotify #列出下面的文件,说明服务器内核支持inotify
    -rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events
    -rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances
    -rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches

yum install -y inotify-tools
#配置生成密码文件,用以和BK端rsync服务连接认证
echo "password" > /etc/rsync.pass      //password为自定义的密码
chmod 600 /etc/rsync.pass

vim inotify_rsync.sh                   //编写inotify实时监控脚本
#!/bin/bash
SRC='/data/devops'                     //要备份同步的文件目录
DEST='rsyncuser@192.168.131.68::backup'       
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

nohup ./inotify_rsync.sh  &> /dev/null &      //后台实时执行脚本


#在BK服务器端
yum install -y rsync rsync-daemon
echo "rsyncuser:password" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

mkdir /backup                //创建备份目录

#服务器端启动rsync服务
rsync --daemon 可加入/etc/rc.d/rc.local实现开机启动
systemctl start rsyncd       //centos7或8

#测试
watch -n 0.5 ls -l /backup/devops  //观察sdevops目录里的文件实时变化,以0.5秒时间为间隔更新

扩展:用LVS替代haproxy代理调度

 上面已经完成了整个实验的所有搭建与配置,这里顺便说一下,用LVS替代haproxy实现向后端web服务器转发请求,不需要手动配置ipvs规则,我们把代理规则写在keepalived的配置文件里即可:

vim /etc/keepalived/keepalived.conf       //在原有的配置文件最后添加下面代码

virtual_server 192.168.131.249 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.131.38 80 {
        weight 1
        TCP_CHECK {
        connect_timeout5
        nb_get_retry3
        delay_before_retry3
        connect_port80
        }

    }

    real_server 192.168.131.58 80 {
        weight 1
        TCP_CHECK {
        connect_timeout5
        nb_get_retry3
        delay_before_retry3
        connect_port80
        }
    }
}
#重启keepalived服务,查看ipvs规则:
[root@localhost /]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.131.249:80 rr
  -> 192.168.131.38:80            Route   1      0          0         
  -> 192.168.131.58:80            Route   1      0          0 

#这时候关闭haproxy依然能正常访问站点,注意haproxy关闭后,mysql代理即无效了,这时候要直连数据库服务器……

最后站点测试

 好了,到现在为止,我们的整个服务的配置搭建已经完成了,现在开启所有我们配置好的服务,在haproxy服务器上的状态页上有所有代理服务的状态显示,显示为绿色即为正常连接状态:
在这里插入图片描述
 我们找一台客户端,给虚拟IP起一个域名,我们打开hosts文件C:\Windows\System32\drivers\etc\hosts,在里面添加:
192.168.131.249 www.wdpress.net
然后在浏览器里输入刚刚设定的域名:www.wdpress.net
在这里插入图片描述
正常情况下会打开如上的页面,我们自定义一个站点名称和密码,然后登陆进去
在这里插入图片描述
登陆进去后我们会看见很多选项,可以试着更改一下主题和发表一篇文章,点击发布:
在这里插入图片描述
然后重新登陆,可以看到设定的主题和发布的文章:
在这里插入图片描述
 为了测试出我们的请求会被haproxy调度到后端不同的web服务器上去,可以在其中一台服务器上的nginx配置文件里添加隐藏版本的命令:

vim /apps/nginx/conf/nginx.conf
http {                       //在http之内server之外
   server_tokens off;        //隐藏版本命令
   server {
   }
}

第一次刷新:
在这里插入图片描述
再次刷新:
在这里插入图片描述
 很明显相同的请求是被调度到不同的web服务器上的,好了整个实验到这里就已经结束了,由于时间有限,实验中还有很多可以完善的点和更好的解决方案,这些以后都会和大家慢慢分享,也由于本人的水平有限,实验中间不免会出现描述不明确或直接的错误,希望大家发现后及时提醒指出,万分感谢……

Linux CentOS下搭建DNS+squid+nginx+mysql高可用web服务器.zip_nginx转发mysql Linux CentOS下搭建DNS+squid+nginx+mysql高可用web服务器.zip 立即下载

相关推荐

计组头哥实验 实验三 MIPS寄存器实验

了解 MIPS 寄存器文件基本概念,进一步熟悉多路选择器、译码器、解复用器等 Logisim 组件的使用,并利用相关组件构建 MIPS 寄存器文件。

gdz0007的博客 1万+

LVS+Keepalived

理论支持 Keepalived工具介绍(作用) 专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 官方网站: http://www.keepalived.orgl Keepalived实现原理 Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能 VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务; 每个热备组内同时只有一台主路

mcc 329

WAVE格式

一.wave格式概述 Wave文件格式是用于多媒体文件存储的Microsoft RIFF(Resource Interchange FileFormat)的一个子集。每一个RIFF文件以一个文件头开始,后面是一系列数据块。Wave文件通常是包含“WAVE”块的RIFF文件。而该“WAVE”块由两个子块组成,称为“fmt”块。“fmt”块用于确定数据格式,并且“data”块包含实际的样本数据,

yejia1280的博客 4389

LNMP+HAProxy+Keepalived负载均衡(一)- LNMP基础环境准备

环境版本说明: 服务器系统:CentOS 7.5: cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) # 输出结果 服务器IP地址: Web服务器:192.168.6.100,192.168.6.110 DB服务器:192.168.6.200,192.168....

weixin_34234829的博客 313

Palantir解密:说人话,到底什么是“本体”?

笔者2018年在云计算公司开展政企数字化专项时,便意识到全面数字化进程背后存在大量未知领域,尤其是未来数字世界的底层架构如何构建这一关键问题。可惜因为种种原因,连那几个小专项最终都未能落地,也就无从深入了。近期看了很多有关Palantir的材料,倒觉得这像是新硅谷(区别于比尔盖茨、扎克伯格等主导的硅谷时代)交出的一份关于“数字世界底层架构”的答案,至于这个答案是否成立、有没有更优解、我们本土对标的版本是什么,可能都还待看。《Palantir解密》系列尝试通过解析Palantir,来系统回答这一问题。

SZSDQJC的博客 2155

极验滑块验证码破解与研究(一):AST还原混淆JS

极验滑块验证码破解与研究(一):AST还原混淆JS声明一、环境安装1. node安装1.1. node下载1.2. 配置环境变量1.3. node安装检测1.4. pycharm配置node环境2. babel库安装2.1. babel库安装命令2.2. babel库安装检测二、AST还原混淆JS1. 模块导入2. AST还原流程3. 复制还原需要用到的js源码4. AST还原函数详解4.1. replace_unicode4.2. replace_unicode, replace_name_array,

帯泪的鱼的博客 1万+

Centos7部署Haproxy+Nginx+nfs服务

目录 前言 环境介绍 一、关闭防火墙 二、编译安装Nginx 测试 二、安装Haproxy服务 测试 前言 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。 Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服。 NFS(Network File System)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享彼此的...

axxdll的博客 1799

视频倍速 - 在线调倍速的加速器APP工具

一刀工具箱APP提供一键可将手机上的视频倍速播放,可以调整视频倍速的加速器,调节视频的速度也就是调节视频的播放速度!一键可将手机上的视频倍速播放,可以调整视频倍速的加速器,调节视频的速度也就是调节视频的播放速度!视频倍速-在线调倍速的加速器-一刀工具箱APP。...

无涯教程 7555

项目一 nfs 共享服务器 Haproxy 代理 Keepalive 高可用集群

深入理解程序的数据存储 配置NFS服务器 配置ansible环境

2401_84376072的博客 426

使用Python实现卷积神经网络(CNN)

卷积神经网络是一种专门用于处理具有网格状拓扑结构数据(如图像、声音)的深度学习模型。CNN的核心组件是卷积层和池化层,它们能够有效地从图像中提取特征并实现空间不变性,使得模型能够对图像中的物体进行识别和分类。我们定义一个简单的卷积神经网络模型,包括卷积层、池化层和全连接层。return x# 创建模型实例我们选择交叉熵损失函数作为分类任务的损失函数,并使用随机梯度下降(SGD)作为优化器。

Echo_Wish 4489

统计学习导论(ISLR) 第四章分类算法课后习题

统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导论(ISLR)(二):统计学习概述 统计学习导论(ISLR)(三):线性回归 统计学习导论(ISLR)(四):分类 ISLR统计学习导论之R语言应用(二):R语言基础 ISLR统计学习导论之R语言应用(三):线性回归R语言代码实战 ISLR统计学习导论之R语言应用(四):分类算法R语言代码实战 统计学习导论

阿里云专家博主、数据科学领域优质创作者、统计er在读 2万+

中小企业web集群方案 haproxy+varnish+LNMP+memcached配置

前段时间帮一个中型企业做了一个集群方案配置,目前已经安全运行了一个月,而且速度非常快,稳定性也很强,作为一般中型企业负载均衡的方案,非常的合适。但是由于资本有限,没有做到高可用性方案。 一,拓扑图如下: 二,架构说明及配置 1,haproxy服务器:192.168.1.5 2,varnish服务器集群:1...

weixin_33736048的博客 151

MATLAB与ROS联合仿真——实例程序搭建思路

MATLAB与ROS联合仿真——实例程序搭建思路

慕羽★的博客 5229

部署LNMP动态网站

总结:在web1主机上部署wordpress,将数据库进行迁移,需要将旧数据下载传输到新主机上,并修改php文件告诉wordpress新数据库位置;web集群,将web1上的wp传输其他web主机上;总结:将wp的页面文件html/*放到nfs主机上并与原地址进行挂载;当点击http://www.lab.com页面中任意链接时,地址栏上的地址,都会变成192.168.88.11。# 3. 测试账号,如果可以成功登陆mysql,则数据库和用户创建正确。# 2. 通过ansible的script模块执行脚本。

qq_44864681的博客 160

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Haproxy+keepalived高可用集群

LNMP高可用集群架构 Haproxy+keeplived :192.168.15.105,192.168.15.106 Nginx+php :192.168.15.107,192.168.15.108 NFS+rsyncd :192.168.15.111,192.168.15.112 mysql :192.168.15.114 一...

weixin_33912445的博客 504

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

project - 1

负载均衡策略非常多,包括Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)等。支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。mysql> select * from wp_posts\G # 查看wp_posts表中的内容。- name: compress html # 压缩html目录到/root下。同时支持通过获取指定的URL来检测后端服务器的状态。

ShiLiu_mtx的博客 924

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux运维集群PROJECT 二

linux运维集群PROJECT 01:服务器硬件 、 部署LNMP动态网站 02: 网站架构演变 、 LNP+Mariadb数据库分离 、 Web服务器集群 03: Keepalived高可用 、 部署Ceph分布式存储 04: 部署Git版本控制系统 、 优化Web服务器 文章目录linux运维集群PROJECT网站架构演变 、 LNP+Mariadb数据库分离 、 Web服务器集群网站架构演变问题步骤一:单机版LNMP二:独立数据库服务器三:Web服务器集群与Session保持四:动静分离、数据库集

weixin_43051805的博客 313

HA-LNMP高可用架构搭建WEB

部署数据库 #数据库主从配置一样 [root@nginx-1 ~]#yum install vim gcc gcc-c++ wget autoconf net-tools lrzsz iotop lsof iotop bash-completion curl policycoreutils openssh-server openssh-clients postfix libaio -y [ro...

李凯的博客 1159

项目:网站架构,集群

网站架构的演变 问题 单机版LNMP 独立数据库服务器 Web服务器集群与Session保持 动静分离、数据库集群 各种缓存服务器 业务模型 单机版LNMP 单机版网站,拓扑如图所示。 用户量少时使用,简单、成本低、存在单点故障。 独立数据库服务器 独立数据库服务器是将网站静态文件、代码文件等资料与数据库分离的架构,当用户量增加时单机的处理能力有限,PHP或JAVA代码的执行需要消耗大量CP...

tian1345的博客 409

部署高可用动态网站(二)

服务器硬件、部署LNMP动态网站、 网站架构、LNP+Mariadb数据库分离、Web服务器集群 Keepalived高可用、部署Ceph分布式存储 部署Git版本控制系统、优化Web服务器 一:网站架构 步骤一:单机版LNMP 单机版网站,拓扑如图-1所示。 图-1 单机版网站服务器 用户量少时使用,简单、成本低、存在单点故障。 步骤二:独立数据库服务器 独立数据库服务器是将网站静态文件、代码...

doapull的博客 430

nginx php nfs,nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

实现LNMP实现环境:服务版本系统CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主机IPMysql_master192.168.37.108Mysql_slave192.168.37.105Nginx+PHP192.168.37.103Nginx+PHP192.168.37.104HAProx...

weixin_42522131的博客 1236

PROJECT1: LNP+Mariadb数据库分离 + Web服务器集群+Keepalived高可用+NFS实现数据共享!案例应用

项目1:综合应用(LNMP+WEB+KEEPALIVED+CEPH) 1.服务器硬件配置用高配如: 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,M

weixin_langhua博客 546

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

实现LNMP 实现环境: 服务 版本 系统 CentOS7.6 Mysql 5.6.34 Nginx 1.14.2 PHP 7.1.30 HAProxy 1.8.20 Keepalived 1.3.5 NFS 1.3.0 主机 IP Mysql_master 192.168.37.108 Mysql_slave 192.168.37...

weixin_33966365的博客 1029

LNMP高可用网站搭建教程- 2020/12/8

LNMP、CDN(智能DNS)、KeepAlived+LVS架构、Haproxy+Keepalived架构、MFS文件系统、MySql主主同步

奔跑的小猫 778

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现

介绍    keepalived     keepalived是一个使用C语言编写的路由软件,设计目的是为Linux系统和基于Linux的虚拟架构提供简单而强大的负载均衡和高可用设施。负载均衡依赖于广泛使用的LIinux虚拟服务器(IPVS)内核模块,提供四层的负载均衡;keepalived实现了一组检查程序,可以根据其运行状态动态的自适应地维护和管理负载均衡服务器池。另一方面,VRRP(虚拟路由...

weixin_34384681的博客 299

# Linux实战笔记:WordPress文创项目部署全流程记录

WordPress是一款开源免费 PHP+MySQL架构的内容管理系统(CMS,Content Management System),2003 年正式发布,基于 GPLv2 开源协议,任何人都可免费使用、修改、二次开发、商用,无需授权费。核心定位:快速搭建各类网站,无需大量代码基础,是全球占有率最高的建站程序,全球超 43% 网站基于 WordPress 搭建。WordPress可演变成为:博客、企业官网、商城、资讯门户、课程网站、作品集、下载站等,需要程序员二次开发。

weixin_46136019的博客 453
上一篇: ansible playbook 源码编译到部署nginx
下一篇: Docker构建Nginx+Tomcat镜像(实现动静分离)
云巅的cat
博客等级 码龄7年 42粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值