一台Nginx是不稳定的,如果这台Nginx挂掉了,及时后面的服务是正常的,也无法访问了,所以正常情况下,需要配置Nginx高可用集群,当一台Nginx挂掉之后,可以继续由其余Nginx继续完成请求的处理工作。
要向搭建Nginx高可用,需要准备两台Nginx服务,两个Keepalived服务,Keepalived指定虚拟ip,还有实际的Tomcat服务。
# 安装Keepalived
[root@bogon ~]# yum install keepalived -y
# 检查Keepalived是否安装成功
[root@bogon ~]# rpm -q -a keepalived
Keepalived的安装位置在/etc/keepalived目录下,在目录下可以找到Keepalived的配置文件keepalived.conf。我们需要通过修改keepalived.conf来实现Nginx的高可用。
修改后的keepalived.conf内容。
# 全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.0.123
smtp_connect_timeout 30
# 路由id
router_id LVS_DEVEL
# 设置运行脚本默认用户和组。如果没有指定,则默认用户为keepalived_script(需要该用户存在),否则为root用户。默认groupname同username
script_user root
# 如果脚本路径的任一部分对于非root用户来说,都具有可写权限,则不会以root身份运行脚本
enable_script_security
}
# 检测Nginx是否还存活的脚本
vrrp_script check_nginx {
# 脚本文件的位置
script "/usr/local/src/nginx_check.sh"
interval 2 # 检测脚本执行的间隔
weight 2 # 设置当服务器的权重
}
# 虚拟IP的配置
vrrp_instance VI_1 {
state MASTER # 表示当前服务器是MASTER还是BACKUP
interface ens33 # 绑定的网卡名称
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 每隔多久发送一次心跳,默认是1秒
# 权限校验
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址
virtual_ipaddress {
192.168.0.222
}
# 指定监控脚本
track_script {
# 这里的check_nginx对应上面的vrrp_script的名字
check_nginx
}
}
nginx_check.sh脚本。(感觉老师给的脚本不对,看了下评论区,有人提到这个问题,尝试修改了下)
从Keepalived的配置信息来看,Keepalived会每隔2秒执行一次脚本检查Nginx进程是否还在。
如果Nginx进程的数量等于0,尝试重启Nginx,等待2秒让Nginx启动完成,再次检测Nginx的进程数量,如果还是0,就把Keepalived服务也停掉,如果Keepalived服务不停掉,虚拟IP不能自动飘到另一台机器上。
如果Nginx在2s内正常启动了,那么就当什么都没有发生。
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
之后,需要给这个脚本执行权限:chmod 744 /usr/local/src/nginx_check.sh,否则脚本无法执行,注意,这里不能给777权限,如果给777,在执行脚本的时候,会提示如下信息,导致脚本执行失败。
Apr 3 11:45:34 bogon Keepalived_vrrp[21615]: Unsafe permissions found for script '/usr/local/src/nginx_check.sh'.
Apr 3 11:45:34 bogon Keepalived_vrrp[21615]: Disabling track script check_nginx due to insecure
还需要关闭selinux。
临时关闭命令:setenforce 0,重启后又会打开。
永久关闭命令:sed -i “s/^SELINUX=.*/SELINUX=disabled/g” /etc/selinux/config,然后重启。
为了测试这个脚本,花了挺久的,说下里面的坑和排查方法。
- 使用两个窗口连接服务器,一边执行Keepalived的启动命令,一边查看日志,使用“tail -f /var/log/messages”可以查看到Keepalived的启动日志
- 如果日志中明显提示有错误信息,根据日志提示的错误进行修改即可,常见的有:unknown keyword xxx,这种一般是单词拼错了,或者是前后的变量不对应(比如,track_script里的脚本名称要和vrrp_script的名称对应,否则找不到脚本),还有可能是复制粘贴带过来的特殊符号问题(Windows里的换行符和Unix里的换行符不一致问题)
- nginx_check.sh这个脚本要赋予执行权限,但是不能赋予777权限,要想检查nginx_check.sh对不对,可以手动执行一次,看看功能正常不正常,如果功能正常,说明检测脚本没问题,否则根据报错修改脚本
- 关闭selinux
保证脚本正确之后,再往后做。
这里要用两台服务器,提前搞出来一台,复制虚拟机也行,重装也行,然后安装Nginx和Keepalived,修改配置文件后,启动两台Nginx和Keepalived服务。
# 跳转到Nginx目录启动Nginx
[root@bogon sbin]# cd /usr/local/nginx/sbin/
[root@bogon sbin]# ./nginx
# 启动Keepalived
[root@bogon sbin]# systemctl start keepalived.service
# 查看Keepalived进程
[root@bogon sbin]# ps -ef | grep keepalived
下面进行测试。
分别启动两台服务器上的Nginx和Keepalived,通过浏览器访问虚拟IP,可以看到Nginx的界面,这时候,我们关掉主的Nginx和Keepalived,再次刷新页面,Nginx依旧可以访问。
在Nginx的从服务器上,使用ip a命令,可以看到在ens33网卡下,其实绑定了虚拟IP。
[root@bogon sbin]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:6f:46:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.124/24 brd 192.168.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.0.222/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::6907:4913:db7b:dcb/64 scope link noprefixroute
valid_lft forever preferred_lft foreve
上面的模式是一主一从的模式,使用ip a命令查看虚拟IP的时候,在Nginx的主服务器上,可以看到虚拟IP,当主挂掉后,虚拟IP才会绑定到Nginx的从服务器。
下面介绍双主模式,只需要在Keepalived的配置文件里加一段内容即可。
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.0.222
}
# 指定监控脚本
track_script {
# 这里的check_nginx对应上面的vrrp_script的名字
check_nginx
}
}
上面的测试方法不大好,这里说一种动态的测试方法,当一台Nginx挂掉后,感受Keepalived动态切换到另一台的效果。
先进入Nginx的目录下“/usr/local/nginx/html”,编辑“index.html”,在Welcome to nginx!下面加一行标识,我这里加了一个服务器的ip,能够看出来哪台Nginx即可。
然后重启两台机器的Nginx和Keepalived服务,打开浏览器,需要在浏览器端下载一个自动刷新的插件,方便测试,我这里用的“Smart Auto Refresh”这个插件,访问虚拟IP,设置一秒刷新一次。
这时候,我们可以看到“Welcome to nginx!”下面有我们的标识IP。
找到这台机器,将它的Nginx和Keepalived服务停掉,另外观察定时刷新页面的变化,可以看到标识信息自动变化了。
测试的时候,还有一点需要注意,需要在浏览器开发工具的Network里Disable Cache,否则可能看不到正常的现象。