nginx+keepalived 主从搭建
前言
本文用来记录nginx加keepalived实现高可用,避免出现单点故障。
准备
- Linux CentOS7 系统
- nginx 1.12.2
- keepalived 1.3.5
规划图
虚拟IP | 真实IP | hostname | nginx端口 | 主从 |
---|---|---|---|---|
10.200.1.200 | 10.200.1.5 | nginx_master | 80 | Master |
10.200.1.200 | 10.200.1.6 | nginx_backup | 80 | Backup |
注意点
把搭建过程中的坑写的前边,避免下次再遇到
- 机器的hostname一定要修改,不能出现相同的,相同会导致VIP不漂移
- 防火墙开放80端口
- selinux对keepalived的影响,我遇到的是在执行监控脚本无法调用系统服务命令(systemctl stop keepalived),解决办法有3
- 不调用系统服务命令来启动或关闭应用,只用kill杀死进程
- 关闭selinux
- 找到selinux具体是什么权限导致在监控脚本无法调用系统服务命令(我没找到)
安装
在VirtualBox下安装CentOS7操作系统,配置IP地址和hostname
通过yum命令来安装epel-release、nginx、keepalived
1
2
3# yum install epel-release -y
# yum install nginx -y
# yum install keepalived -y复制第一步安装好的系统,配置IP地址和hostname
配置
Master配置
keepalived 配置
1
# vi etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43! Configuration File for keepalived
#全局配置
global_defs {
#运行keepalived的机器的一个标识
router_id LVS_DEVEL_MASTER
}
#VRRPD配置
vrrp_script check_nginx {
#脚本监测
script "/opt/check_nginx.sh"
#脚本执行间隔,每2s检测一次
interval 2
#脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -20
weight -20
}
#定义vrrp实例
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
state MASTER
#指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同
interface enp0s3
#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
virtual_router_id 51
#定义优先级,数字越大,优先级越高
priority 100
#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
advert_int 1
#设置验证类型和密码。主从必须一样
authentication {
auth_type PASS
auth_pass 1111
}
#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
virtual_ipaddress {
10.200.1.200
}
#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
track_script {
check_nginx
}
}监测脚本编写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
pids=$(pidof keepalived)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
#/usr/bin/systemctl start nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" -a "${pids}" != "" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
#/usr/bin/systemctl stop keepalived
#如果关闭了selinux可以只用上边的命令,如果没有直接用kill
#kill -9 $pids
fi
fi监测脚本授权
1
# chmod +x /opt/check_nginx.sh
Backup配置
keepalived 配置
1
# vi /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32! Configuration File for keepalived
global_defs {
#和Master不同的地方
router_id LVS_DEVEL_BACKUP
}
vrrp_script check_nginx {
script "sh /opt/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
#和Master不同的地方
state BACKUP
interface enp0s3
virtual_router_id 51
#和Master不同的地方
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.200.1.200
}
track_script {
check_nginx
}
}直接把Master的脚本拷贝过来
测试
关闭master的nginx服务,测试nginx是否会被重启
检查页面是否正常测试VIP是否会漂移
- 注释检测脚本启动nginx服务的命令
- 查看页面
- 执行systemctl stop nginx命令,查看页面
结语
本记录只记录了核心的部分,如果是生成环境用,还有在熟悉其他的配置,比如发邮件配置等