一、引言

在互联网应用中,Nginx 是一款非常常用的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。但在实际生产环境里,单台 Nginx 服务器可能会因为硬件故障、软件崩溃等原因出现服务中断的情况,这就会影响用户的正常访问。为了保证服务的高可用性,我们可以使用 Keepalived 来实现 Nginx 的故障自动切换。接下来,咱们就详细聊聊这个方案。

二、应用场景

想象一下,你经营着一家电商网站,每天都有大量的用户访问。要是 Nginx 服务器突然挂了,用户就无法正常浏览商品、下单,这会给你带来巨大的损失。这时候,Nginx 高可用方案就派上用场了。通过 Keepalived 实现故障自动切换,当主 Nginx 服务器出现问题时,能迅速将流量切换到备用服务器,保证网站的正常运行。

再比如一些企业的内部办公系统,员工需要通过这个系统进行日常工作。如果 Nginx 服务中断,员工就无法正常办公,影响工作效率。采用高可用方案,就能避免这种情况的发生。

三、Keepalived 与 Nginx 结合的原理

Keepalived 是一个基于 VRRP(虚拟路由冗余协议)的高可用解决方案。简单来说,它会监控 Nginx 服务器的状态。在一个 Nginx 集群中,有主服务器和备用服务器。Keepalived 会在主服务器上运行一个监控程序,不断检查 Nginx 是否正常工作。如果主服务器上的 Nginx 出现故障,Keepalived 会自动将虚拟 IP(VIP)从主服务器切换到备用服务器,这样用户访问的 VIP 就会指向备用服务器,实现故障自动切换。

四、环境准备

4.1 服务器准备

我们需要准备两台服务器,一台作为主服务器,一台作为备用服务器。这里假设主服务器的 IP 是 192.168.1.100,备用服务器的 IP 是 192.168.1.101,虚拟 IP 是 192.168.1.102。

4.2 安装 Nginx 和 Keepalived

在两台服务器上都安装 Nginx 和 Keepalived。以 CentOS 系统为例,使用以下命令进行安装:

# 技术栈:Linux Shell
# 安装 Nginx
yum install -y nginx
# 安装 Keepalived
yum install -y keepalived

五、配置 Nginx

5.1 主服务器配置

在主服务器上,编辑 Nginx 配置文件 /etc/nginx/nginx.conf,添加以下内容:

# 技术栈:Nginx
server {
    listen 80;
    server_name _;
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

然后启动 Nginx 服务:

# 技术栈:Linux Shell
systemctl start nginx
systemctl enable nginx

5.2 备用服务器配置

备用服务器的 Nginx 配置和主服务器类似,同样编辑 /etc/nginx/nginx.conf,添加相同的内容,然后启动 Nginx 服务。

六、配置 Keepalived

6.1 主服务器配置

编辑主服务器的 Keepalived 配置文件 /etc/keepalived/keepalived.conf,内容如下:

# 技术栈: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.102  # 虚拟 IP
    }
}

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

track_script {
    chk_nginx
}

创建检查 Nginx 状态的脚本 /etc/keepalived/check_nginx.sh,内容如下:

# 技术栈:Linux Shell
#!/bin/bash
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    systemctl start nginx
    sleep 2
    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        exit 1
    fi
fi
exit 0

给脚本添加执行权限:

# 技术栈:Linux Shell
chmod +x /etc/keepalived/check_nginx.sh

启动 Keepalived 服务:

# 技术栈:Linux Shell
systemctl start keepalived
systemctl enable keepalived

6.2 备用服务器配置

编辑备用服务器的 Keepalived 配置文件 /etc/keepalived/keepalived.conf,内容如下:

# 技术栈:Keepalived
! Configuration File for keepalived

global_defs {
    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.1.102  # 虚拟 IP
    }
}

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

track_script {
    chk_nginx
}

同样创建检查 Nginx 状态的脚本 /etc/keepalived/check_nginx.sh,并添加执行权限,然后启动 Keepalived 服务。

七、技术优缺点

7.1 优点

  • 高可用性:通过 Keepalived 实现故障自动切换,能保证 Nginx 服务的高可用性,减少服务中断时间。
  • 配置简单:Keepalived 的配置相对简单,易于上手,即使是没有太多经验的开发者也能快速配置。
  • 成本低:不需要额外的硬件设备,只需要在现有的服务器上安装 Keepalived 即可。

7.2 缺点

  • 单点故障风险:虽然实现了 Nginx 的高可用,但 Keepalived 本身可能成为单点故障。如果 Keepalived 出现问题,可能会影响故障切换的正常进行。
  • 资源浪费:备用服务器在正常情况下处于闲置状态,会造成一定的资源浪费。

八、注意事项

  • 网络环境:确保主服务器和备用服务器在同一个局域网内,并且网络连接稳定。
  • 权限问题:在配置 Keepalived 和 Nginx 时,要确保相关文件和脚本有足够的权限。
  • 日志监控:定期查看 Keepalived 和 Nginx 的日志,及时发现并解决问题。

九、测试故障切换

我们可以手动停止主服务器上的 Nginx 服务,模拟故障情况,观察虚拟 IP 是否会自动切换到备用服务器。

# 技术栈:Linux Shell
systemctl stop nginx

然后使用 ping 命令测试虚拟 IP 是否能正常访问。如果能正常访问,说明故障切换成功。

十、文章总结

通过使用 Keepalived 实现 Nginx 的故障自动切换,我们可以大大提高 Nginx 服务的可用性。在实际应用中,我们需要根据具体的业务需求和环境进行合理的配置。同时,要注意技术的优缺点和相关的注意事项,确保系统的稳定运行。