keepalived双机热备nginx
nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽然用docker跑nginx集群更方便,但传统的方式总是有他的可取之处,并且多学一些东西也很好。以后也会写如何使用docker跑nginx集群。
环境准备:
2台centos: 192.168.0.105 和192.168.0.118, 虚拟IP(VIP)为192.168.0.119
配置keepavlived
分别在105和118上安装keepalived
yum install keepalived
准备心跳角本
keepalived的配置相当灵活,可以定时执行角本命令,用于心跳检查,比如,我们访问nginx发现nginx不可访问时,就关闭keepalived,从而切换到从nginx来实现不间断的服务支持。
vi /etc/keepalived/keepalived.conf
#!/bin/bash
count=0
for (( k=0; k<2; k++ ))
do
check_code=$( curl --connect-timeout 3 -sL -w "%{http_code}\n" http://localhost:81 -o /dev/null )
if [ "$check_code" != "200" ]; then
count=count +1
continue
else
count = 0
break
fi
done
if [ "$count" != "0" ]; then
killall keepalived
exit 1
else
exit 0
fi
这段角本的意思就是说每次的心跳检查会执行一个for循环,访问http://localhost:81,在for的2次循环中如果返回的状态都不是200就会关闭keepalived。这个角本在105和118两台机器上都要准备好。
设置118机器上的keepalived为主节点,105机器上的keepalived为从节点,它们两个的配置文件差不太多
vi /etc/keepalived/keepalived.conf
118机器keepalived的配置文件
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 心跳检测角本
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 3 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 2 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface eth0 #指定监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
mcast_src_ip 192.168.0.118 ## 发送多播数据包时的源IP地址
virtual_router_id 51 #虚拟路由标识,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高
advert_int 2 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码。主从必须一样
auth_type PASS #设置vrrp验证类型,主要有PASS和AH两种
auth_pass 1111 #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress {
192.168.0.119 #VRRP 虚拟地址 如果有多个VIP,换行填写
}
track_script {
chk_nginx # 心跳脚本,即在 vrrp_script 部分指定的名字
}
}
115机器上的角本对上面的角本稍做变动即可
改变 state MASTER -> state BACKUP,priority 100 -> priority 90,mcast_src_ip 192.168.0.118 -> mcast_src_ip 192.168.0.105。其他的地方保持不变,是不是很简单。
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
}
vrrp_instance VI_1 {
state BACKUP # 修改
interface eth0
mcast_src_ip 192.168.0.105 # 修改 为本机IP
virtual_router_id 51
priority 90 #数字变小
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.119
}
track_script {
chk_nginx
}
}
到这里keepalived的简单配置就完成了下面就启动keepalived
service keepalived start
安装Nginx
查看nginx的依赖库是否完整
rpm -qa zlib
rpm -qa zlib-devel
rpm -qa openssl
rpm -qa openssl-devel
rpm -qa pcre
rpm -qa pcre-devel
rpm -qa gcc
如果没有就安装
yum -y install gcc zlib zlib-devel openssl openssl-devel pcre-devel
下载并解压nginx
mkdir nginxsrc
cd nginxsrc/
wget http://nginx.org/download/nginx-1.13.9.tar.gz
tar zxvf nginx-1.13.9.tar.gz
cd nginx-1.13.9/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
安装在/usr/local/nginx/sbin/nginx 目录下
make&&make install
执行成功后会显示leaving directory
启动
/usr/local/nginx/sbin/nginx
检查
ps aux|grep nginx
开机启动
vi /etc/rc.local
添加一行
/usr/local/nginx/sbin/nginx
因为我的机器上80端口被别的应用占用了,所以就修改105和118的 nginx.conf 把端口80 修改为81
vi /usr/local/nginx/conf/nginx.conf
分别个性105 和119上的index.html 加上一个ip以便们们识别打开的是哪个ip上的index.html
vi /usr/local/nginx/html/index.html
nginx重新加载配置
/usr/local/nginx/sbin/nginx -s reload
好了,我们访问一下
curl 192.168.0.119:81
返回的html是 118机器上的index.html
现在我们把118的nginx停止
/usr/local/nginx/sbin/nginx -s stop
这时118上的keepalived的心跳检查角本发现nginx无法访问会把keepalived关闭,然后转向从节点
我们再访问一下119
curl 192.168.0.119:81
在118上重新启动nginx和keepalived
再访问119 返回的网址是118上的index.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android openGl 绘制简单图形的实现示例
- 解决Android studio 3.6.1 出现Cause: unable to find valid certification path to requested target 报错的问题
- 使用kotlin实现MVP的方式(简单好用)
- Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解
- android studio更新gradle错误构建项目失败的解决方法
- Android Studio使用Kotlin时,修改代码后运行不生效的解决方法
- 服务端开发人员必备网页调试工具:Postman
- 树莓派使用DHT11模块读取温湿度
- 用Go 写了个负载均衡器
- 给MacBook写一个更好的Windows触摸板驱动程序
- 小程序多图上传服务器接收返回数据操作
- WordPress屏蔽某个国家地方的IP访问
- Linux的php-fpm优化教程/php-fpm进程占用内存大和不释放内存问题
- 基于DNSmasq写了个WEB界面(开源)
- Android Studio3.6新特性之视图绑定ViewBinding使用指南