接上一文章<<CentOS 6.5高可用集群LVS+Keepalived>>html
本文主要是配置Nginx、Keeplive,至于Nginx的配置就省略了nginx
一、服务器规划bash
服务器IP 服务服务器
192.168.80.77 VIPtcp
192.168.80.188 Keepalived(Master)、Nginx(Backup)oop
192.168.80.189 Keepalived(Slave)、Nginx(Backup)url
二、目标spa
全部的请求都经过1.77虚拟服务转发给1.188服务器,而189做为188的备份,当188服务挂掉了,自动切换到189.net
三、Nginx配置code
安装省略......,Nginx 安装目录:/usr/local/nginx
1) 18八、189配置index.html来区分是哪台nginx工做:
在188上配置:
echo "192.168.80.188" > /usr/local/nginx/html/index.html
在189上配置
echo "192.168.80.189" > /usr/local/nginx/html/index.html
验证方法:
1)、首先用IP访问各自的nginx,看index.html页面内容是否为当前服务器的IP地址
二、 配置keepalived
按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、从服务器的配置相关联但有所不一样。以下:
Master:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
Backup:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
验证:
通过前面的配置,若是主服务器的keepalived中止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会从新接管VIP。 但这并非咱们须要的,咱们须要的是当NginX中止服务的时候可以自动切换。
keepalived支持配置监控脚本,咱们能够经过脚本监控NginX的状态,若是状态不正常则进行一系列的操做,最终仍不能恢复NginX则杀掉keepalived,使得从服务器可以接管服务。
最简单的作法是监控NginX进程,更靠谱的作法是检查NginX端口,最靠谱的作法是检查多个url可否获取到页面。
若是发现NginX不正常,重启之。等待3秒再次校验,仍然失败则再也不尝试。
根据上述策略很容易写出监控脚本。这里使用nmap检查nginx端口来判断nginx的状态,记得要首先安装nmap。监控脚本以下:
#!/bin/sh # check nginx server status NGINX=/usr/local/nginx/sbin/nginx PORT=80 nmap 127.0.0.1 -p $PORT | grep "$PORT/tcp open" #echo $? if [ $? -ne 0 ];then #$NGINX -s stop $NGINX sleep 3 nmap 127.0.0.1 -p $PORT | grep "$PORT/tcp open" #[ $? -ne 0 ] && /etc/init.d/keepalived stop [ $? -ne 0 ] && killall keepalived fi
不要忘了设置脚本的执行权限,不然不起做用。
假设上述脚本放在/usr/local/nginx/chk_nginx.sh,则keepalived.conf中增长以下配置:
vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } track_script { chk_http_port }
增长完成后的配置以下:
Master:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } track_script { chk_http_port } } vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
Backup:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } track_script { chk_http_port } } vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
更进一步,为了不启动keepalived以前没有启动nginx , 能够在/etc/init.d/keepalived的start中首先启动nginx:
start() { /usr/local/nginx/sbin/nginx sleep 3 echo -n $"Starting $prog: " daemon keepalived ${KEEPALIVED_OPTIONS} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog }
参考:http://www.cnblogs.com/holbrook/archive/2012/10/25/2738475.html#sec-5