Nginx 高可用
1、使用Keepalived程序让nginx高可用
下载:https://www.keepalived.org/download.html
上传到服务器
解压:tar -zxvf keepalived-2.0.18.tar.gz
然后就安装三部曲,./configure、make、make install
打开配置文件
vim keepalived.conf
global_defs { # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一 router_id keep_171 } vrrp_instance VI_1 { # 表示状态是MASTER主机还是备用机BACKUP state MASTER # 该实例绑定的网卡 #查看网卡名称 ip addr interface ens33 # 保证主备节点一致即可 virtual_router_id 51 # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选 priority 100 # 主备之间同步检查时间间隔,单位秒 advert_int 2 # 认证权限密码,防止非法节点进入 authentication { auth_type PASS auth_pass 1111 } # 虚拟出来的ip,可以有多个(vip) virtual_ipaddress { 192.168.1.161 } }
启动
./keepalived
注册为系统服务
在keepalived下有个etc目录的,进入去 cp init.d/keepalived /etc/init.d/ cp sysconfig/keepalived /etc/sysconfig/ systemctl start keepalived.service
2、keepalived也可能崩的,也需要主备
配置备
global_defs { router_id keep_172 } vrrp_instance VI_1 { # 备用机设置为BACKUP state BACKUP interface ens33 virtual_router_id 51 # 权重低于MASTER priority 80 advert_int 2 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { # 注意:主备两台的vip都是一样的,绑定到同一个vip 192.168.1.161 } }
增加Nginx重启检测脚本
vim /etc/keepalived/check_nginx_alive_or_not.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` # 判断nginx是否宕机,如果宕机了,尝试重启 if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
增加运行权限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
配置keepalived监听nginx脚本
vrrp_script check_nginx_alive { script "/etc/keepalived/check_nginx_alive_or_not.sh" interval 2 # 每隔两秒运行上一行脚本 weight 10 # 如果脚本运行失败,则升级权重+10 }
在 vrrp_instance 中新增监控的脚本
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
重启Keepalived使得配置文件生效
systemctl restart keepalived
3、双主热备
规则:以一个虚拟ip分组归为同一个路由

主节点配置:
global_defs { router_id keep_171 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.161 } } vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.162 } }
备节点配置
global_defs { router_id keep_172 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.161 } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.162 } }
4、LVS
一般不会直接使用keepalived直接作用在nginx上,而是keepalived+LVS+Nginx实现高可用。
LVS 基于四层,工作效率高
单个Nginx承受不了压力,需要集群
LVS 充当Nginx集群的调度者
Nqinx 接受请求来回,LVS可以只接受不响应



5、前期准备:
服务器与ip规划:
LVS - 1台
VIP(虚拟IP):192.168.1.150
DIP(转发者IP/内网IP):192.168.1.151
Nginx - 2台(RealServer)
RIP(真实IP/内网IP):192.168.1.171
RIP(真实IP/内网IP):192.168.1.172
所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:
systemctl stop NetworkManager
systemctl disable NetworkManager
创建子接口
cd /etc/sysconfig/network-scripts/ #数字可以是其他,只是随便起个别名 cp ifcfg-ens33 ifcfg-ens33:1
修改子接口配置: vim ifcfg-ens33:1,保留这些即可
BOOTPROTO="static" DEVICE="ens33:1" ONBOOT="yes" IPADDR=192.168.1.150 #虚拟IP NETMASK=255.255.255.0
service network restart
安装集群管理工具
yum install ipvsadm
6、搭建LVS-DR模式- 为两台RS配置虚拟IP
#这个文件上网查一查 cp ifcfg-lo ifcfg-lo:1 修改为 DEVICE=lo:1 IPADDR=192.168.1.150 NETMASK=255.255.255.255 NETWORK=127.0.0.1 BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
service network restart
另一台
cp ifcfg-lo ifcfg-lo:1 修改为 DEVICE=lo:1 IPADDR=192.168.1.150 NETMASK=255.255.255.255 NETWORK=127.0.0.1 BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
这样两台虚拟ip都构建好了
7、搭建LVS-DR模式- 为两台RS配置arp
ARP响应级别与通告行为的概念
- arp-ignore:ARP响应级别(处理请求)
只要本机配置了ip,就能响应请求
请求的目标地址到达对应的网络接口,才会响应请求 - arp-announce:ARP通告行为(返回响应)
本机上任何网络接口都向外通告,所有的网卡都能接受到通告
尽可能避免本网卡与不匹配的目标进行通告
只在本网卡通告
打开sysctl.conf:
vim /etc/sysctl.conf
配置 所有网卡 、 默认网卡 以及 虚拟网卡 的arp响应级别和通告行为,分别对应: all , default , lo :
两台都是相同配置 # configration for lvs net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
刷新配置文件:
sysctl -p
增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:
两台都是相同配置 route add -host 192.168.1.150 dev lo:1 route -n
开机自启
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
8、搭建LVS-DR模式- 使用ipvsadm配置集群规则
创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
-A:添加集群
-t:tcp协议
ip地址:设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询
-p:设置连接持久化的时间
创建2台RS真实服务器
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式
保存到规则库,否则重启失效
ipvsadm -S
检查集群
查看集群列表 ipvsadm -Ln 查看集群状态 ipvsadm -Ln --stats
其他命令:
# 重启ipvsadm,重启后需要重新配置 service ipvsadm restart # 查看持久化连接 ipvsadm -Ln --persistent-conn # 查看连接请求过期时间以及请求源ip和目标ip ipvsadm -Lnc # 设置tcp tcpfin udp 的过期时间(一般保持默认) ipvsadm --set 1 1 1 # 查看过期时间 ipvsadm -Ln --timeout #更详细的帮助文档 ipvsadm -h man ipvsadm
至此,已经实现单个LVS+两个Nginx,但这样LVS还是有可能崩的,所以LVS要配置主备
9、Keepalived+LVS,主配置
修改Keepalived的配置文件
global_defs { router_id LVS_151 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 41 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.150 } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual server 192.168.1.150 80 { # 健康检查的时问,单位:秒 delay_loop 6 #配置负载均衡的算法,默认是轮询 lb_algo rr # 设置LVS的模式 NAT | TUN | DR lb_kind DR # 设置会话持久化的事件 persistence_timeout 5 #协议 -t protocol TCP #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.1.171 80 { #轮询的默认权重配比设置为1 weight 1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #超时时间 connect_timeout 2 # 重试次数 2次 nb_get_retry 2 # 间隔时间 3秒 delay_before_retry 3 } } real_server 192.168.1.172 80 { weight 1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #超时时间 connect_timeout 2 # 重试次数 2次 nb_get_retry 2 # 间隔时间 3秒 delay_before_retry 3 } } }
清空规则 ipvsadm -C 重启 systemctl restart keepalived
10、Keepalived+LVS,备配置
修改Keepalived的配置文件
global_defs { router_id LVS_152 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 41 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.150 } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual server 192.168.1.150 80 { # 健康检查的时问,单位:秒 delay_loop 6 #配置负载均衡的算法,默认是轮询 lb_algo rr # 设置LVS的模式 NAT | TUN | DR lb_kind DR # 设置会话持久化的事件 persistence_timeout 5 #协议 -t protocol TCP #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.1.171 80 { #轮询的默认权重配比设置为1 weight 1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #超时时间 connect_timeout 2 # 重试次数 2次 nb_get_retry 2 # 间隔时间 3秒 delay_before_retry 3 } } real_server 192.168.1.172 80 { weight 1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #超时时间 connect_timeout 2 # 重试次数 2次 nb_get_retry 2 # 间隔时间 3秒 delay_before_retry 3 } } }
清空规则 ipvsadm -C 重启 systemctl restart keepalived

浙公网安备 33010602011771号