keepalived搭建高可用nginx负载均衡集群
1、nginx的安装
nginx编译需要使用一些插件,不然编译报错,所以在安装前先执行如下命令:
1、yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、wget http://nginx.org/download/nginx-1.13.0.tar.gz下载nginx压缩文件。
3、tar -zxvf nginx-1.13.0.tar.gz -C ./ 建议下载的nginxgz包
4、进入nginx解压后的目录执行 ./configure --prefix=/usr/local/nginx,如下:
5、make & make install 安装nginx
6、/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf启动nginx。
2、keepalived的安装
keepalived下载地址:https://www.keepalived.org/download.html
下载后通过ftp或其它方式上传到服务器制定目录下。
执行命令
1、tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
2、yum install -y openssl openssl-devel(需要安装一个软件包)
3、cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
4、make && make install
编译出现这个警告的话*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
则执行yum -y install libnl libnl-devel
3、keepalived配置文件
高可用有2种方式。
1、Nginx+keepalived 主从配置
这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、Nginx+keepalived 双主配置
这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于当前架构环境。
本次例子是使用主从配置。
主keepalived配置文件 vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {#全局配置
notification_email {#指定keepalived在发生切换时需要发送email到的对象,一行一个
root@localhost #指定收件人邮箱
}
notification_email_from root@localhost #指定发件人
smtp_server 127.0.0.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_MASTER #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
}
vrrp_script chk_http_port {
script "/opt/chk_nginx.sh" #这里通过脚本监测
interval 2 ## 检测时间间隔
weight -5 ## 如果条件成立,权重-5
fall 2 # 失败两次后判定故障
rise 1 # 成功一次后判定成功
}
vrrp_instance VI_1 {
state MASTER #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
interface eth0 #设置实例绑定的网卡
virtual_router_id 55 #VPID标记
priority 101 #优先级,高优先级竞选为master
advert_int 1 #检查间隔,默认1秒
authentication { #设置认证,两个节点必须一致
auth_type PASS #认证方式,类型主要有PASS、AH 两种
auth_pass root #认证密码
}
virtual_ipaddress { #虚拟 IP 池, 两个节点设置必须一样
10.150.28.107 #设置vip
}
track_script { #用于追踪脚本判断nginx是否正常,不正常关闭keepalived
chk_http_port
}
}
备keepalived配置文件 vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_MASTER
}
vrrp_script chk_http_port {
script "/opt/chk_nginx.sh"
interval 2
weight -1
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 55
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress {
10.150.28.107
}
track_script {
chk_http_port
}
}
4、编辑nginx检测脚本
vi /opt/chk_nginx.sh (需要在主备机器上都生成脚本文件)
chmod a+x chk_nginx.sh(赋予脚本执行权限)
工作过程中,keepalived连接到nginx异常后,启动脚本检测nginx是否挂掉,如果挂掉后,尝试重新启动nginx,等待2s继续查看nginx是否正常,如果不正常则剔除本台机器的keepalived服务。
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx -c /etc/nginx/nginx.conf
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived.service
fi
fi
启动keepalived服务:systemctl start keepalived.service
需要关闭防火墙或开放端口!!!
此时本地通过访问vip即可看到nginx页面,如下:
这时候,其实访问的只有主keepalived+nginx,你可以通过停止systemctl stop keepalived.service后继续访问vip,发现页面正常,这时候使用的就是备用keepalive。
脚本校验则把主keepalived的那台机器上的nginx停掉,发现几秒后nginx自动启动了(保证keepalived服务正常)则脚本正常。脚本没有重启nginx可以尝试使用setenforce 0命令,这个命令时临时的,重启不生效,需要sed -i “s/^SELINUX=.*/SELINUX=disabled/g” /etc/selinux/config永久关闭,然后重启服务器生效。