准备:两台虚拟机 CentOS Linux release 7.5.1804
(Core)、pcre-8.45.tar.bz2
、nginx-1.21.3.tar.gz
ip地址分别为:192.168.10.102
和192.168.10.103
关于网关和子网掩码:请看下图,可以知道两台虚拟机所在的子网为192.168.10.xxx
,所以下面设置的虚拟ip
就是要满足这个要求
虚拟机ip
可通过ifconfig
查找获取
查看两台虚拟机防火墙,保证处于关闭状态:
[root@hadoop102 nginx-1.21.3]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@hadoop103 local]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
2.1 进入 nginx 官网,下载
下载ngnix
和pcre
ngnix:http://nginx.org
pcre:命令拉取
进入/opt/software/
拉取pcre
cd /opt/software/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
#查看当前目录内容
ls -l
解压文件
tar xvf pcre-8.45.tar.gz
进入解压后的目录
cd pcre-8.45
[root@hadoop102 pcre-8.45]# pwd
/opt/software/pcre-8.45
在当前目录下,先安装相关依赖
安装 openss
、zlib
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
然后
./configure
./configure
完成后,回到 pcre
目录下执行 make
,
再执行 make install
make && make install
验证安装
[root@hadoop102 pcre-8.45]# pcre-config --version
8.45
/usr/local/bin
目录下会生成pcre-config
、pcregrep
、pcretest
三个文件
类似pcre安装,不用再次安装依赖包了,步骤如下
1、 解压缩 nginx-xx.tar.gz
包。
2、 进入解压缩目录, 执行./configure。
3、 make && make install
验证安装
进入nginx目录下的sbin目录,启动nginx
./nginx
在本机浏览器中输入192.168.10.102
访问缺省时端口是80
,来启动nginx
,出现以下结果说明nginx启动正常
退回nginx
主目录,ls
查看内容
两台虚拟机同样安装上面步骤安装,不要使用xcall
分发,会导致用不了
不要通过yum
安装!不要通过yum
安装!不要通过yum
安装!
重要事情说三遍,亲测,版本太低,导致与nginx
无法兼容,报错,一直无法解决
配置高可用文件
(1)修改/etc/keepalived/keepalived.conf 配置文件
进入/opt/software
目录下拉取2.0.9版本的keepalived
,下载很快,用的华为云的镜像,而且很好用
wget https://mirrors.huaweicloud.com/keepalived/keepalived-2.0.9.tar.gz
解压并安装
tar xf keepalived-2.0.9.tar.gz
cd keepalived-2.0.9/
./configure
make && make insatll
执行文件keepalived.service
安装位置默认安装在/usr/local/sbin
配置文件keepalived.conf
安装位置默认安装在/usr/local/etc/keepalived/keepalived.conf
不想用了的话,也很好卸载,卸载时把这两个位置卸载即可
/usr/local/etc{sysconfig, keepalived}
和 /usr/local/sbin/keepalived.service
或通过whereis keepalived
来查找路径
配置keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ # 配置在优先级最高处
cp /usr/local/sbin/keepalived /etc/init.d/ #设置为全局
启动keepalived
systemctl daemon-reload
systemctl start keepalived
查看服务是否启动成功
配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.10.102
smtp_connect_timeout 30
router_id LVS_DEVEL #也可以写ip地址,这里是host的映射名,需要到host中配
#置,不过随便写一个唯一也没事,最多就是警报的时候找不到ip,通知不到而已,host
#文件位置在/etc/hosts
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 20
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script{ # 这里调用检测脚本执行,一秒检测一次
chk_http_port
}
virtual_ipaddress {
192.168.10.50 // VRRP H 虚拟地址
}
}
从机只改两处:
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
priority 100 # 备用机改为90就好,备机取不同的优先级,主机值较大,备份机值较小
这里主机写权值为100
,而备用机写90
是有根据的,是靠调用检测脚本来的,里边有权重20
,只要检测不到,说明宕机了,那那权重就不给这台机器了,总体权限priority+weight
就会降低为priority
,而备用机没有宕机依旧是priority+weight
,就在这里发生了主备切换了
(2)在/usr/local/src
添加检测脚本nginx_check.sh
,并添加执行权限
#!/bin/bash
# 获取nginx进程数,并赋值给A,没有进程则为0
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
# 开启nginx服务
/usr/local/nginx/sbin/nginx
sleep 2
# nginx没有启动成功
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
# 杀死keepalived进程
killall keepalived
fi
fi
通过以下命令添加执行权限
chmod +x nginx_check.sh
如果是复制我的脚本,复制后先./nginx_check.sh
看能否运行
[root@hadoop102 src]# ./nginx_check.sh
-bash: ./xxxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
如果出现以上错误,说明很有可能是由以下原因引起的:
1.在Windows系统上编写的Shell脚本,然后上传到Linux服务器执行
2.Windows系统中的换行符是"\n\r",Linux系统中的换行符是"\n",因此需要将\r替换为空白。
解决方案:
Linux sed命令可自动编辑一个或多个文件,执行以下命令即可。
sed -i 's/\r$//' xxxxx.sh
启动前可以先开启服务器系统日志,方便查错
tail -f /var/log/messages
开启后,将该会话作为日志跟踪,再开启另外两个会话给两台虚拟机
集群启动必须按照以下顺序启动,否则无法唤醒从机
1.启动两台虚拟机的ngnix
./nginx
2.启动主节点的keepalived
3.启动从节点的keepalived
测试:
浏览器输入虚拟ip地址:192.168.10.50
192.168.10.102
:查看虚拟ip192.168.10.50
保持开放着
192.168.10.103
:还没有唤醒192.168.10.50
这个虚拟ip
先关闭主节点keepalived
,再关闭nginx
,没有为什么,先关闭nginx
后,keepalived
的脚本检测不到nginx
进程后会试图去启动服务,需要先关闭keepalived
服务
192.168.10.102
:虚拟ip
已经没有了,看看是否转移到了192.168.10.103
节点去了
192.168.10.103
:发现多了一个虚拟ip
再次访问页面:
访问成功,192.168.10.102
宕机后,192.168.10.103
接替了这个虚拟ip
这时还没完,先把nginx服务开启,再开启keepalived
后,发现102
节点多了虚拟ip
,103
的虚拟消失了,再次访问页面,成功,说明102
优先级是高于103
的
为了解决集群,足足切换了好几个版本的keepalived
,所以,想配置集群而且刚好看到本文的,推荐连同ngnix
和pcre
的版本保持一致
特别鸣谢:https://www.cnbugs.com/post-2857.html
解决文件执行问题:https://blog.csdn.net/l1028386804/article/details/110246256
以及B主尚硅谷:https://www.bilibili.com/video/BV1zJ411w7SV?p=15
Keepalived权值问题详见:https://blog.csdn.net/HzSunshine/article/details/62041036