一:keepalived简介
nginx+keepalived如下图所示:
Keepalived:
是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。
VRRP协议:全称 Virtual Router Redundancy Protocol
即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(RouterGroup),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
高可用有2种方式:
1、Nginx+keepalived 主从配置
这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、Nginx+keepalived 双主配置
这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于当前架构环境。
如下图所示:
服务器列表:
主机名 | 角色 | IP |
---|---|---|
Nginx1 | nginx+keepalived | 192.168.218.133 |
Nginx2 | nginx+keepalived | 192.168.218.134 |
二:安装Nginx
1、安装依赖库
yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel openssl-devel
2、下载nginx-1.14.0.tar.gz
http://nginx.org/download/
3、将压缩包文件复制到/usr下
4、解压
cd /usr
tar -zxvf nginx-1.14.0.tar.gz
5、配置安装
cd /usr/nginx-1.14.0
./configure
make && make install
如果需要stream ,则configure命令使用以下
./configure --with-stream
6、查看文件夹/usr/local中如果有nginx文件夹,则表示安装成功
7、nginx启停
使用以下命令进行启停nginx
启动nginx:
/usr/local/nginx/sbin/nginx
重启nginx:
#/usr/local/nginx/sbin/nginx -s reload :修改配置后重载
#/usr/local/nginx/sbin/nginx -s reopen :重新打开日志文件
#/usr/local/nginx/sbin/nginx -t 测试nginx配置文件是否正确
关闭nginx:
#/usr/local/nginx/sbin/nginx -s stop :快速停止nginx
#/usr/local/nginx/sbin/nginx quit :完整有序的停止nginx
其他的停止nginx 方式:
ps -ef | grep nginx
kill -QUIT 主进程号 :从容停止Nginx
kill -TERM 主进程号 :快速停止Nginx
pkill -9 nginx :强制停止Nginx
8、配置文件地址
/usr/local/nginx/conf/nginx.conf
访问地址:
http://192.168.218.133/
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html;#设置界面刷新
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/; #设置监控后端启动的端口
}
三:安装keepalived2.0.0
yum --showduplicates list keepalived
1、下载
https://www.keepalived.org/download.html
2、下载编译所需工具
yum install curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel libnl libnl-devel -y
查看依赖安装情况
rpm -qa curl gcc openssl-devel libnl3-devel net-snmp-devel libnl libnl-devel
3、将压缩包文件复制到/usr下
4、解压
cd /usr
tar -zxvf keepalived-2.0.0.tar.gz
5、安装
cd /usr/keepalived-2.0.0
./configure --prefix=/usr/local/keepalived
make && make install
#将配置文件copy到系统对应目录下
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/init.d/keepalived
#在/etc/keepalived下创建一个nginx_check.sh脚本文件 内容如下(主从都需要这个文件)
vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #尝试重新启动nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
#添加执行权限
cd /etc/keepalived
chmod +x nginx_check.sh
6、配置文件
#修改配置文件–将master主机配置文件内容替换为以下内容
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id tomcat.pro
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.180
}
track_script {
chk_nginx
}
}
#修改配置文件–将backup主机配置文件内容替换为以下内容
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id tomcat.pro
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.180
}
track_script {
chk_nginx
}
}
7、启动命令
systemctl start keepalived
systemctl status keepalived
#访问虚拟IP查看是否成功(绑定的虚拟IP作为新的地址进行访问)
#使用ip addr命令查看网卡是否有绑定的虚拟IP,拥有虚拟IP的主机为MASTER主机。(如果都拥有虚拟IP即都为MASTER或者有两个及以上的主机为MASTER,可能的原因是防火墙问题
#全局定义块
1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。
2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
3、router_id:用户标识本节点的名称,通常为hostname
4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。
#VRRP实例定义块
vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
vrrp_instance:vrrp实例名
1> state:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。
2> interface:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。
3> mcast_src_ip:本机IP地址
4> virtual_router_id:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。
5> priority:节点优先级,取值范围0~254,MASTER要比BACKUP高
6> advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
7> lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口
8> authentication:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。
9> smtp_alert:有故障时是否激活邮件通知
10> nopreempt:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
11> virtual_ipaddress:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
#虚拟服务器virtual_server定义块
virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
1> delay_loop:健康检查时间间隔,单位:秒
2> lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr
3> lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
4> persistence_timeout:http服务会话保持时间,单位:秒
5> protocol:转发协议,分为TCP和UDP两种
real_server:真实服务器IP和端口,可以定义多个
1> weight:负载权重,值越大,转发的优先级越高
2> notify_down:服务停止后执行的脚本
3> TCP_CHECK:服务有效性检测
connect_port:服务连接端口
connect_timeout:服务连接超时时长,单位:秒
nb_get_retry:服务连接失败重试次数
delay_before_retry:重试连接间隔,单位:秒
#如果配置了ssl、并且配置了80自动转443、需要修改nginx.conf文件(将转到本机的IP设置为转到VIP)
server {
listen 80;
server_name localhost;
rewrite ^/(.*)$ https://192.168.31.222:443/$1 permanent;
}
参考资料:Linux搭建nginx+keepalived 高可用(主备+双主模式)
6.第五篇 安装keepalived与Nginx
nginx+keepalived 的安装
linux上的Keepalived下载安装
nginx+keepalived高可用详解配置
https://blog.csdn.net/snakeflash/article/details/105674368