linux-keepalived-04 keepalived-+Nginx+Apache部署
实验要求:
node1、node2作为nginx代理服务器
node3、node4作为web服务器接,搭建apache服务即可。
在nginx配置中使用 修改日志格式,加上客户端的源ip,让web能知道是谁访问了他
初始准备
实验环境
node1(nginx1+keepalived主):192.168.141.53
node2(nginx2+keepalived从):192.168.141.69
node3(web1):192.168.141.12
node4(web2):192.168.141.132
VIP:192.168.10.100
node1、node2
注意:node1、node2的防火墙必须关闭掉,不能像noed3、node4一样仅仅添加策略放行相应端口。如果node1、node2的防火墙没有关闭掉,那么会出现Nginx + keepalived高可用主备服务器均有VIP的问题。另外,如果二者keepalived的配置文件中virtual_router_id不同的话,也会出现Nginx + keepalived高可用主备服务器均有VIP的问题。
1 | [root@node1 ~]# systemctl stop firewalld |
noed3、node4
1 | [root@node3 ~]# firewall-cmd --add-port={80,8080}/tcp --permanent |
nginx部署
node1、node2
1 | [root@node2 ~]# yum install epel-release -y |
node1
1 | [root@node1 ~]# cd /etc/nginx/conf.d/ |
node2
1 | [root@node1 ~]# cd /etc/nginx/conf.d/ |
注意:这里也可以设置权重和端口号
1 | upstream websers { |
node3
1 | [root@node3 ~]# yum install httpd -y |
node4
1 | [root@node4 ~]# yum install httpd -y |
检查node3、node4的apache服务是否正常
检查node1、node2的nginx服务是否正常
node1、node2
检测完毕,如上图,apache和nginx服务都是正常的。
Keepalived部署
node1
1 | [root@node1 conf.d]# cd |
node2
1 | [root@node2 conf.d]# cd |
keepalived+nginx实现高可用的特点
如上图,我们需要自定义脚本检测nginx服务是否正常
node1
1 | 给keepalived配置文件增加script内容 |
script解析:
1 | # 定义script |
注意:优先级减少之后需不需要加回来?不需要,从起nginx后自动回到初始值,也就是把nginx关了重启之后其优先级自动恢复到100,不需要你手动去加。
node1定义判断nginx是否正常的脚本,down的话返回1,正常的话返回0
1 | [root@node1 ~]# vim /usr/local/src/check_nginx_pid.sh |
node2不需要上述改动,因为总共就两台nginx服务器,所以检测nginx运行是否正常的机器只需要一台就够了。
1 | [root@node2 ~]# systemctl restart keepalived |
测试keepalived的vip是否在主服务器上
node1
1 | [root@node1 ~]# ip add |
node2
1 | [root@node2 ~]# ip add |
检测vip是否可用
解析:这里curl vip:8080,之所以要加上端口,是因为keepalived只将vip转换为真实ip:192.168.141.53&69,而之前我们定义的nginx反向代理所监听的端口是8080,所以就要加上端口才能访问了。但是这个访问到的并非是web上的80端口,例如直接访问:192.168.141.12:8080是打不开页面的。我们之前做的反向代理是将web服务器上的192.168.141.12:80和192.168.141.132:80反向代理成192.168.141.53:8080或者192.168.141.69:8080。
停止node1的Keepalived服务,观察VIP是否漂移,访问正常
1 | [root@node1 ~]# systemctl stop keepalived |
可以看到vip现在已经转移到了node2上面
1 | [root@node2 ~]# ip add |
测试漂移后的vip的可用性
由于keepalived主设备的选举默认是抢占模式的,所以我们重启node1的keepalived之后,vip能够重新自node2上面漂移回到node1上面。
1 | [root@node1 ~]# systemctl restart keepalived |
1 | [root@node2 ~]# ip add |
可以看到vip已经漂移回到node1上了
我们解析一下之前用来判断nginx是否关闭的脚本
1 | [root@node1 ~]# cat /usr/local/src/check_nginx_pid.sh |
这个脚本里有个变量A=ps -C nginx –no-header |wc -l
停止node1的nginx服务,查看一下变量A的值,可以看到关闭了nginx的话,A=0。
1 | [root@node1 ~]# systemctl stop nginx |
对比与node1,我们来看看node2这台nginx并未关闭时A的值,可以看到A!=0
1 | [root@node2 ~]# ps -C nginx --no-header |wc -l |
停止node1的nginx服务,观察VIP是否漂移,访问正常
1 | [root@node1 ~]# systemctl stop nginx |
可以看到vip已经漂移到了node2
1 | [root@node2 ~]# ip add |
测试漂移后的vip的可用性
现在将node1的nginx服务器重启,看看vip能都漂移回来
1 | [root@node1 ~]# systemctl restart nginx |
node2
1 | [root@node2 ~]# ip add |
可以看到vip已经漂移回node1上面了
最终测试一下漂移回来的vip的可用性
将node3上的httpd服务关闭
1 | [root@node3 ~]# systemctl stop httpd |
访问vip
重新启动node3的httpd服务
1 | [root@node3 ~]# systemctl restart httpd |
再次访问vip
测试结束