Nginx+Keepalive 实现高可用并启用健康检查模块

1. 目标效果

keepalived 负责监控 192.168.1.20 和 192.168.1.30 这两台负载均衡的服务器,并自动选择一台作为主服务器。用户访问 http://192.168.1.10 时,由主服务器接收该请求。当 keepalived 检测到主服务器不可访问时,会将备服务器升级为主服务器,从而实现高可用。

在主服务器中,通过 nginx(tengine)实现负载均衡,将访问请求分流到 192.168.1.100 和 192.168.1.200 这两台业务服务器。 nginx 中的健康检查模块会检测业务服务器状态,如果检测到 192.168.1.100 不可访问,则不再将访问请求发送给该服务器。

2. 部署 Keepalived

2.1 主机 IP

主机 IP
虚拟 IP 192.168.1.10
主服务器 192.168.1.20
备服务器 192.168.1.30

2.2 主服务器设置

官方配置说明文档:Keepalived for Linux

bash 复制代码
yun install vim epel-release keepalived nginx -y

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
    router_id nginx01
}

vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2   
    weight 2  
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linalive
    }
    virtual_ipaddress {
        192.168.1.10
    }
    track_script {
        check_nginx
    }
}
EOF

touch /etc/keepalived/nginx_check.sh && chmod +x /etc/keepalived/nginx_check.sh
cat > /etc/keepalived/nginx_check.sh <<EOF
#!/bin/bash
if ! pgrep -x "nginx" > /dev/null; then
    systemctl restart nginx
    sleep 2
    if ! pgrep -x "nginx" > /dev/null; then
        pkill keepalived
    fi
fi
EOF

2.2 备服务器设置

bash 复制代码
yun install vim epel-release keepalived nginx -y

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
    router_id nginx02
}

vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2   
    weight 2  
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linalive
    }
    virtual_ipaddress {
        192.168.1.10
    }
    track_script {
        check_nginx
    }
}
EOF

touch /etc/keepalived/nginx_check.sh && chmod +x /etc/keepalived/nginx_check.sh
cat > /etc/keepalived/nginx_check.sh <<EOF
#!/bin/bash
if ! pgrep -x "nginx" > /dev/null; then
    systemctl restart nginx
    sleep 2
    if ! pgrep -x "nginx" > /dev/null; then
        pkill keepalived
    fi
fi
EOF

3. 部署 Tengine (主备服务器)

3.1 准备 Tengine 压缩文件

下载 tengine 压缩文件,将文件上传到 /opt 文件夹下。下载地址:The Tengine Web Server

本文章编写时,最新版是:tengine-3.1.0.tar.gz

3.2 解压并编译

bash 复制代码
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
tar zxvf /opt/tengine-3.1.0.tar.gz -C /opt
cd /opt/tengine-3.1.0

# configure 有众多的参数可设置,可使用 ./configure --help 进行查看
# 按照官方说法默认应该是开启了健康检查模块,但实测需要手动添加参数
./configure --add-module=modules/ngx_http_upstream_check_module/

make && make install

3.3 添加服务项

bash 复制代码
cat > /etc/systemd/system/nginx.service <<EOF
[Unit]
Description=The Tengine HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

3.4 编辑 nginx 配置文件

此处配置的内容项可参考官方文档:ngx_http_upstream_check_module

bash 复制代码
# tengine 默认的安装路径是 /usr/local/nginx
# 配置文件路径: /usr/local/nginx/conf/nginx.conf
# /favicon.ico 是接口地址,需替换成真实的 api 接口
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    upstream cluster1 {
        server 192.168.1.100:8082;
        server 192.168.1.200:8089;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD /favicon.ico HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }


    server {
        listen 80;
        server_name localhost;
        location / {
            index Index.aspx;
            proxy_pass http://cluster1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


        location /status {
            check_status;
            access_log   off;
        }
    }
}

3.5 启动服务并访问

使用 systemctl start nginx启动服务,并访问 localhost:80/status查看健康检查报表页

4. 写在最后

参考文章:Nginx配置高可用(Nginx+keepalived)

相关推荐
可可嘻嘻大老虎5 小时前
nginx无法访问后端服务问题
运维·nginx
阳光九叶草LXGZXJ6 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
无忧智库6 小时前
某市“十五五“地下综合管廊智能化运维管理平台建设全案解析:从数字孪生到信创适配的深度实践(WORD)
运维·智慧城市
珠海西格6 小时前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
阿波罗尼亚7 小时前
Kubectl 命令记录
linux·运维·服务器
IDC02_FEIYA7 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器
犀思云7 小时前
如何通过网络即服务平台实现企业数字化转型?
运维·网络·人工智能·系统架构·机器人
江畔何人初7 小时前
kubectl apply与kubectl create的区别
linux·运维·云原生
M158227690558 小时前
四通道全能组网!SG-Canet-410 CAN转以太网网关,破解工业CAN通信瓶颈
linux·运维·服务器
浪客灿心8 小时前
Linux库制作与原理
linux·运维·服务器