这里用到的就是nginx默认配置,基本没咋改,如果要了解配置文件详情,点击()有详细说明。两台虚拟机配置的nginx.conf内容如下:
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #gzip on; server { # 需要防火墙开放80端口 listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
第二步准备html
两台虚拟机中html,用的是nginx默认的index.html(路径:/usr/local/nginx/html),为了方便演示,在index.html中增加了个105和106的显示标注,105机器内容如下,106机器上的html只是把内容中的105改成106即可:
第三步准备两台虚拟机上keepalived配置文件(路径:/etc/keepalived)
105机器上keepalived.conf内容如下:
! Configuration File for keepalived global_defs { # 每台机器不一样 router_id 31 } #检测nginx服务是否在运行 vrrp_script chk_nginx { #使用脚本检测 script "/usr/local/src/chk_nginx.sh" #脚本执行间隔,每2s检测一次 interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -5 #连续2次检测失败才确定是真失败 fall 2 #检测到1次成功就算成功 rise 1 } vrrp_instance VI_1 { # vrrp实例,可以配置多个 state MASTER # 网卡名称,通过ip addr 命令可以看到对应网卡,需要哪个就配置哪个就行 interface enp0s8 # 路由ID,主、备节点的id要一样 virtual_router_id 3 # 优先级,主节点的优先级要大于备节点的优先级 priority 200 # 主备心跳检测,间隔时间为1s advert_int 1 # 认证方式,主备节点要一致 authentication { auth_type PASS auth_pass 123456 } #执行监控的服务。 track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。 chk_nginx } virtual_ipaddress { # 虚拟IP 192.168.30.108 } }在/usr/local/src/中准备chk_nginx.sh,keepalived和nginx没有直接关系的,只有通过检查nginx的运行状态来进行高可用服务切换,chk_nginx.sh内容如下:
然后给这个文件增加执行权限,命令如下:
chmod +x chk_nginx.sh106虚拟机上的步骤和检测脚本chk_nginx.sh都一样,只是keepalived.conf内容稍微有点变动。
106机器上keepalived.conf内容如下:
! Configuration File for keepalived global_defs { # 每台机器上不一样 router_id 32 } #检测nginx服务是否在运行 vrrp_script chk_nginx { #使用脚本检测 script "/usr/local/src/chk_nginx.sh" #脚本执行间隔,每2s检测一次 interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -5 #连续2次检测失败才确定是真失败 fall 2 #检测到1次成功就算成功 rise 1 } vrrp_instance VI_1 { # 配置为备节点 state BACKUP # ip addr 查看对应的网卡名称 interface enp0s8 virtual_router_id 3 # 优先级比主节点低 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } #执行监控的服务 track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。 chk_nginx } virtual_ipaddress { # 虚拟IP 192.168.30.108 } }
第四步分别启动两台虚拟机上的nginx和keepalived,命令如下:
# 启动nginx cd /usr/local/nginx/sbin/ ./nginx # 启动keepalived systemctl start keepalived.service # 查看keepalived状态,是否运行 systemctl status keepalived.service两台虚拟机都要执行
第五步测试,效果如下:
直接访问虚拟IP就能访问到主节点的服务啦;现在测试当主节点挂掉时,还会不会正常访问服务,在105机器上执行如下命令:
# 模拟宕机,停止keepalived systemctl stop keepalived.service # ip addr 查看虚拟IP已经漂移到备节点上了,在备节点用ip addr 查看备节点显示,虚拟IP已经漂移过来啦~
再用虚拟IP访问,效果如下:
看见已经切换到106机器上提供服务啦,这样就实现高可用啦;
那主节点重新恢复,虚拟IP会不会恢复回来继续提供服务呢?
# 重启keepalived systemctl restart keepalived.service #ip addr 查看虚拟IP情况,恢复过来啦继续用虚拟IP访问服务,又回到主服务啦,如果没有,那可能是浏览器缓存,因为这里用静态html演示,清掉缓存再访问。
5.3 多主多备演示