1、软件版本:
nginx-1.12.2.tar.gz
keepalived-1.2.23.tar.gz
2、上传软件包到/root路径下
3、准备依赖包
yum -y install gcc pcre-devel zlib-devel openssl-devel nmap
4、安装nginx
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --with-http_stub_status_module
make && make install
5、安装keepalived
tar zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23
./configure
make && make install
6、拷贝/usr/local/etc和/usr/local/sbin下面文件到/etc和/usr/sbin下对应路径
cp -a /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp -a /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp -a /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp -a /usr/local/sbin/keepalived /usr/sbin/
7、开机运行(nginx会被keepalived脚本拉起来)
systemctl enable keepalived.service
检查
systemctl is-enabled keepalived.service
chkconfig --list
8、配置nginx
两台接入服务器的nginx的配置完全一样,主要是配置/usr/local/nginx/conf/nginx.conf的http。
其中多域名指向是通过虚拟主机(配置http下面的server)实现;
同一域名的不同虚拟目录通过每个server下面的不同location实现;
到后端的服务器在http下面配置upstream,然后在server或location中通过proxy_pass引用。
要实现前面规划的接入方式,http的配置如下:
worker_processes 8;
events {
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream esb-socket {
server 192.168.1.59:12345;
server 192.168.1.84:12345;
server 192.168.1.87:12345;
}
server {
listen 54321;
server_name esb-socket;
location / {
proxy_pass http://esb-socket;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
要修改系统默认打开数限制否则worker_connections还是无效
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
9、配置keepalived
按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。
主、从服务器的配置相关联但有所不同。如下:
注意:配置文件中virtual_router_id参数一定不能用默认值,否则容易因为冲突导致虚IP起不来,建议配置前先查看(用此命令查看tcpdump -i any vrrp)网络中是否已有vrrp广播以及其使用的vrid
master:
! Configuration File for keepalived
global_defs {
#报警邮箱参数删除,其他项保持默认配置
notification_email {
}
router_id esb_socket_master
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
#nginx监控脚本位置
script "/etc/keepalived/nginx_check.sh"
#脚本执行间隔
interval 3
#脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
weight 2
}
vrrp_instance VI_1 {
#主辅标志
state MASTER
#虚IP对应的真实网卡名称(注意:核对网卡名称)
interface ens32
virtual_router_id 51
#设置本节点的优先级,优先级高的为master
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abCD12#$
}
#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
192.168.1.98/24 brd 192.168.1.255 dev ens32 label ens32:VIP
}
#调用vrrp_script
track_script {
chk_http_port
}
}
bakcup1:
! Configuration File for keepalived
global_defs {
#报警邮箱参数删除,其他项保持默认配置
notification_email {
}
router_id esb_socket_backup1
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
#nginx监控脚本位置
script "/etc/keepalived/nginx_check.sh"
#脚本执行间隔
interval 3
#脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
weight 2
}
vrrp_instance VI_1 {
#主辅标志
state BACKUP
#虚IP对应的真实网卡名称(注意:核对网卡名称)
interface eth0
virtual_router_id 51
#设置本节点的优先级,优先级高的为master
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass abCD12#$
}
#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
192.168.1.98/24 brd 192.168.1.255 dev eth0 label eth0:VIP
}
#调用vrrp_script
track_script {
chk_http_port
}
}
backup2:
! Configuration File for keepalived
global_defs {
#报警邮箱参数删除,其他项保持默认配置
notification_email {
}
router_id esb_socket_backup2
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
#nginx监控脚本位置
script "/etc/keepalived/nginx_check.sh"
#脚本执行间隔
interval 3
#脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
weight 2
}
vrrp_instance VI_1 {
#主辅标志
state BACKUP
#虚IP对应的真实网卡名称(注意:核对网卡名称)
interface ens32
virtual_router_id 51
#设置本节点的优先级,优先级高的为master
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass abCD12#$
}
#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
192.168.1.98/24 brd 192.168.1.255 dev ens32 label ens32:VIP
}
#调用vrrp_script
track_script {
chk_http_port
}
}
验证:
先后在主、从服务器上启动keepalived: /etc/init.d/keepalived start
在主服务器上查看是否已经绑定了虚拟IP: ip addr
停止主服务器上的keepalived: /etc/init.d/keepalived stop
然后在从服务器上查看是否已经绑定了虚拟IP:
启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP
10、keepalived使用vrrp协议广播,防火墙要允许该协议
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -p vrrp -j ACCEPT
firewall-cmd --reload
检查
firewall-cmd --direct --get-all-rules
11、让keepalived监控NginX的状态
经过前面的配置,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。
但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。
keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。
如何监控NginX的状态
最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。
如何尝试恢复服务
如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。
根据上述策略很容易写出监控脚本。这里使用nmap检查nginx端口来判断nginx的状态,记得要首先安装nmap。监控脚本如下:
#!/bin/sh
# check nginx server status
NGINX=/usr/local/nginx/sbin/nginx
PORT=54321
#检查nginx端口
nmap localhost -p $PORT | grep "$PORT/tcp open"
#echo $?
#如果nginx端口不通,尝试重启nginx,如果重启操作后依然不通,则停掉本机keepalived进程,虚IP会飘到备机。
if [ $? -ne 0 ];then
$NGINX -s stop
$NGINX
sleep 2
nmap localhost -p $PORT | grep "$PORT/tcp open"
[ $? -ne 0 ] && /etc/init.d/keepalived stop
fi
脚本要有执行权限
chmod 755 nginx_check.sh
12、启动keepalived+nginx
systemctl start keepalived.service
常见问题
获取不到VIP
请检查virtual_router_id是否网络内有冲突,或更换virtual_router_id试试
可以抓包查看vrrp广播数据(查找vrid冲突的广播IP):tcpdump -i any vrrp
主备设备上VIP都起来了
检查步骤10是否正确执行
也可以tcpdump -i any vrrp查看是否主从都在广播,正常情况应该只有主的广播,从的不广播,一旦从的广播说明从的没收到主的广播所以自己开始广播。
虚拟IP正常配置,但是无法ping通虚IP
iptables -nl,检查INPUT项是否有drop
临时删除命令:iptables -D INPUT 1(1为行号,如果有多行,输入正确的行号)
去掉keepalived.conf的global_defs段中的vrrp_strict,重启nginx就不再自动添加该条规则
/var/log/message中报错Keepalived_vrrp[9681]: /etc/keepalived/nginx_check.sh exited due to signal 15
vrrp_script{}中的interval时间要大于脚本中的sleep时间