一、引言

在当今的互联网世界里,服务器的稳定性和可用性是至关重要的。想象一下,如果你经营着一家电商网站,突然服务器因为某个单点故障而无法访问,那将会导致多少订单流失,用户体验会受到多大的影响。为了避免这种情况的发生,我们就需要一种技术方案来实现服务器的高可用。Nginx 和 Keepalived 这对组合就能很好地解决这个问题。Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,而 Keepalived 则是一个能实现高可用的软件,它们联手可以彻底解决单点故障问题。

二、应用场景

2.1 网站服务

对于大型的商业网站,如淘宝、京东等,每天都有大量的用户访问。如果服务器出现单点故障,就会导致网站无法访问,这会给企业带来巨大的经济损失。使用 Nginx 作为反向代理服务器,可以将用户的请求均匀地分发到多个后端服务器上,而 Keepalived 则可以监控 Nginx 服务器的状态,当主服务器出现故障时,自动切换到备用服务器,保证网站的正常运行。

2.2 企业内部系统

企业内部的办公系统、ERP 系统等也需要高可用性。员工在工作过程中需要随时访问这些系统,如果系统出现故障,会影响工作效率。通过 Nginx 和 Keepalived 的组合,可以提高系统的稳定性,确保员工能够正常使用这些系统。

2.3 云计算服务

在云计算环境中,大量的虚拟机和容器需要提供高可用的服务。Nginx 可以作为负载均衡器,将用户的请求分发到不同的虚拟机或容器上,而 Keepalived 可以保证 Nginx 服务的高可用性,从而为云计算用户提供稳定的服务。

三、Nginx 基础

3.1 Nginx 简介

Nginx 是一款轻量级的 HTTP 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,它具有高性能、高并发、低内存消耗等优点。Nginx 的配置非常灵活,可以根据不同的需求进行定制。

3.2 Nginx 安装与配置

以 CentOS 系统为例,安装 Nginx 可以使用 yum 命令:

# 安装 Nginx
yum install nginx -y
# 启动 Nginx
systemctl start nginx
# 设置 Nginx 开机自启
systemctl enable nginx

下面是一个简单的 Nginx 反向代理配置示例:

# Nginx 配置文件 nginx.conf
http {
    server {
        listen 80;
        server_name example.com;

        location / {
            # 反向代理到后端服务器,假设后端服务器地址为 192.168.1.100:8080
            proxy_pass http://192.168.1.100:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

在这个示例中,Nginx 监听 80 端口,当用户访问 example.com 时,Nginx 会将请求转发到 192.168.1.100:8080 这个后端服务器上。

四、Keepalived 基础

4.1 Keepalived 简介

Keepalived 是一个基于 VRRP(虚拟路由冗余协议)的高可用解决方案,它可以监控服务器的状态,当主服务器出现故障时,自动将虚拟 IP 地址(VIP)切换到备用服务器上,从而实现服务的高可用。

4.2 Keepalived 安装与配置

同样以 CentOS 系统为例,安装 Keepalived 可以使用 yum 命令:

# 安装 Keepalived
yum install keepalived -y
# 启动 Keepalived
systemctl start keepalived
# 设置 Keepalived 开机自启
systemctl enable keepalived

下面是一个 Keepalived 的主服务器配置示例:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

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.1.100  # 虚拟 IP 地址
    }
}

备用服务器的配置与主服务器类似,只是将 state 改为 BACKUP,priority 调低,例如 90。

五、Nginx + Keepalived 实现高可用

5.1 配置思路

将 Nginx 和 Keepalived 结合起来,通过 Keepalived 监控 Nginx 服务的状态。当主服务器上的 Nginx 服务出现故障时,Keepalived 会将虚拟 IP 地址切换到备用服务器上,备用服务器上的 Nginx 服务继续提供服务。

5.2 详细配置步骤

5.2.1 主服务器配置

首先,确保 Nginx 和 Keepalived 已经安装并启动。然后,修改 Keepalived 的配置文件,添加对 Nginx 服务的监控:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 检查 Nginx 服务的脚本
    interval 2  # 检查间隔时间,单位为秒
    weight -20  # 如果检查失败,优先级降低 20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx  # 引用上面定义的检查脚本
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

检查 Nginx 服务的脚本 check_nginx.sh 内容如下:

#!/bin/bash
# 检查 Nginx 服务是否正在运行
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    # 如果 Nginx 服务没有运行,尝试启动它
    systemctl start nginx
    sleep 2
    # 再次检查 Nginx 服务是否启动成功
    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        # 如果还是没有启动成功,停止 Keepalived 服务
        systemctl stop keepalived
    fi
fi

给脚本添加执行权限:

chmod +x /etc/keepalived/check_nginx.sh

5.2.2 备用服务器配置

备用服务器的 Keepalived 配置与主服务器类似,只是将 state 改为 BACKUP,priority 调低:

! Configuration File for keepalived

global_defs {
    router_id LVS_BACKUP
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

同样,备用服务器上也需要有 check_nginx.sh 脚本,并添加执行权限。

5.3 测试高可用性

在主服务器上停止 Nginx 服务:

systemctl stop nginx

观察 Keepalived 的日志文件 /var/log/messages,可以看到虚拟 IP 地址已经切换到备用服务器上。此时,访问虚拟 IP 地址 192.168.1.100,备用服务器上的 Nginx 服务会正常响应。

六、技术优缺点

6.1 优点

6.1.1 高可用性

通过 Keepalived 的自动切换功能,当主服务器出现故障时,能够快速将服务切换到备用服务器上,保证服务的不间断运行,大大提高了系统的可用性。

6.1.2 负载均衡

Nginx 作为反向代理服务器,可以将用户的请求均匀地分发到多个后端服务器上,实现负载均衡,提高系统的处理能力。

6.1.3 轻量级

Nginx 和 Keepalived 都是轻量级的软件,对服务器资源的消耗比较小,适合在资源有限的环境中使用。

6.2 缺点

6.2.1 配置复杂度较高

Nginx 和 Keepalived 的配置需要一定的技术知识,对于初学者来说可能比较困难。特别是在处理一些复杂的场景时,需要对配置文件进行精细的调整。

6.2.2 依赖网络环境

Keepalived 是基于 VRRP 协议的,对网络环境有一定的要求。如果网络不稳定,可能会导致虚拟 IP 地址频繁切换,影响服务的正常运行。

七、注意事项

7.1 防火墙配置

在配置 Nginx 和 Keepalived 时,需要确保防火墙允许相关的端口和协议通过。例如,Nginx 默认监听 80 端口和 443 端口,Keepalived 使用 VRRP 协议,需要开放 UDP 端口 112。

7.2 时间同步

Keepalived 依赖系统时间的同步,如果主服务器和备用服务器的时间不一致,可能会导致 VRRP 协议出现异常。因此,需要使用 NTP 服务来保证服务器之间的时间同步。

7.3 日志监控

定期查看 Nginx 和 Keepalived 的日志文件,及时发现和处理可能出现的问题。例如,如果 Nginx 日志中出现大量的错误信息,可能表示后端服务器出现了故障。

八、文章总结

Nginx 和 Keepalived 的组合是一种非常有效的高可用解决方案,它可以彻底解决单点故障问题。通过 Nginx 的反向代理和负载均衡功能,将用户的请求均匀地分发到多个后端服务器上,提高了系统的处理能力。而 Keepalived 则可以监控 Nginx 服务的状态,当主服务器出现故障时,自动将虚拟 IP 地址切换到备用服务器上,保证服务的不间断运行。

在实际应用中,需要根据具体的需求和场景进行合理的配置。同时,要注意防火墙配置、时间同步和日志监控等方面的问题,以确保系统的稳定性和可靠性。虽然 Nginx 和 Keepalived 的配置有一定的复杂度,但只要掌握了基本的原理和方法,就可以轻松实现高可用的服务。