blank
blank
发布于 2019-11-06 / 609 阅读 / 0 评论 / 0 点赞

keepalived + nginx 实现 nginx 服务高可用

我们需要 2 台服务器来完成基于 keepalived nginx 高可用的搭建

配置说明

虚拟IPmasterslave
192.168.1.9192.168.11192.168.13
同网段任意未被占用IP即可主机备机

实现当主机(nginx/keepalived/服务器)挂掉后 服务自动切到 备机
当主机恢复后 会自动返回流量到主机 从而保证 nginx 服务的高可用

安装nginx keepalived

# 在 `master` 和 `slave` 机中运行
yum install nginx keepalived -y

配置 keepalived 配置文件 keepalived.conf

# 在 master 机中运行
# 备份默认配置文件
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
cat > /etc/keepalived/keepalived.conf <<EOF

! Configuration File for keepalived

global_defs {
  
  # fix WARNING - default user 'keepalived_script' for script execution does not exist - please create
  script_user root
  enable_script_security 
}

# 检测脚本
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"     # 心跳执行的脚本,检测nginx是否启动
    interval 2                                  #(检测脚本执行的间隔,单位是秒)
    weight 2                                    # 权重
    fall 3                                      # 检测连续 3 次失败才算确定是真失败 会用weight减少优先级(1-255之间)
    rise 2                                      # 检测 2 次成功就算成功。但不修改优先级
}

#vrrp 实例定义部分
vrrp_instance VI_1 {
    state MASTER                # 指定keepalived的初始角色,MASTER为主,BACKUP为备
    interface ens33             # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    mcast_src_ip 192.168.1.11   # 发送多播数据包时的源IP地址, 如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
    virtual_router_id 11        # 虚拟路由编号,主从要一直
    priority 100                # 优先级最高的 即为 master 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                # 检查间隔,默认为1s(vrrp组播周期秒数)

    # 授权访问
    authentication {
        auth_type PASS      	# 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 11111
    }

    # 调用检测脚本
    track_script {
        check_nginx
    }

    # 定义虚拟ip(VIP),可多设,每行一个
    virtual_ipaddress {
        192.168.1.9
    }
}
EOF


# 在 slave 机中运行
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
cat > /etc/keepalived/keepalived.conf <<EOF

! Configuration File for keepalived

global_defs {
  
  # fix WARNING - default user 'keepalived_script' for script execution does not exist - please create
  script_user root
  enable_script_security 
}

# 检测脚本
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"     # 心跳执行的脚本,检测nginx是否启动
    interval 2                                  #(检测脚本执行的间隔,单位是秒)
    weight 2                                    # 权重
    fall 3                                      # 检测连续 3 次失败才算确定是真失败 会用weight减少优先级(1-255之间)
    rise 2                                      # 检测 2 次成功就算成功。但不修改优先级
}

#vrrp 实例定义部分
vrrp_instance VI_1 {
    state BACKUP                # 指定keepalived的初始角色,MASTER为主,BACKUP为备
    interface ens33             # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    mcast_src_ip 192.168.1.13   # 发送多播数据包时的源IP地址, 如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
    virtual_router_id 11        # 虚拟路由编号,主从要一直
    priority 99                 # 优先级最高的 即为 master 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                # 检查间隔,默认为1s(vrrp组播周期秒数)

    # 授权访问
    authentication {
        auth_type PASS      	# 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 11111
    }

    # 调用检测脚本
    track_script {
        check_nginx
    }

    # 定义虚拟ip(VIP),可多设,每行一个
    virtual_ipaddress {
        192.168.1.9
    }
}
EOF

创建 check_nginx.sh 检测脚本

#  在 `master` 和 `slave` 机中运行
cat > /etc/keepalived/check_nginx.sh <<EOF

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    systemctl start nginx
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        systemctl stop keepalived
    fi
fi
EOF

为了区别不同主机 我们使用 2 个不同的 html文件 来演示

# 在 master 机中运行
cat > /usr/share/nginx/htmml/index.html <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>master</title>
</head>
<body>
hallo this is server master 192.168.1.11
</body>
</html>
EOF


# 在 slave 机中运行
cat > /usr/share/nginx/htmml/index.html <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slave </title>
</head>
<body>
hallo this is server slave 192.168.1.13
</body>
</html>
EOF

masterslave 机中运行

systemctl start nginx --now && systemctl start keepalived

访问 192.168.1.9
显示 当前访问的是 192.168.1.11master

停止 master(192.168.1.11) 中的 nginx

再次访问 192.168.1.9
显示 当前访问的是 192.168.1.13slave

恢复启动 master(192.168.1.11) 中的 nginx

访问 192.168.1.9 显示 当前访问的是 192.168.1.11master

DONE!


评论