在当今数字化时代,Web服务的高可用性至关重要。用户期望无论何时访问网站或应用程序,都能获得快速且稳定的响应。为满足这一需求,通过Nginx反向代理和Keepalived配置实现负载均衡与故障自动切换,成为构建高可用Web集群的关键技术。
一、技术原理
(一)Nginx反向代理
Nginx是一款轻量级的高性能Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。在Web集群中,Nginx作为反向代理服务器,接收来自客户端的请求,并将这些请求转发到后端的真实服务器(Web服务器)。它可以根据配置的规则,如轮询、加权轮询、IP哈希等算法,将请求均匀地分配到不同的后端服务器上,从而实现负载均衡的功能。
(二)Keepalived
Keepalived是一个基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的高可用性解决方案。它的主要作用是防止服务器单点故障的发生。通过VRRP协议,Keepalived可以将两台或多台服务器虚拟成一个虚拟路由器,对外提供一个虚拟IP地址。在这个虚拟路由器组中,有一个主服务器(MASTER)和多个备份服务器(BACKUP)。正常情况下,主服务器负责处理请求,备份服务器处于监听状态。当主服务器出现故障时,备份服务器会自动接管主服务器的工作,继续提供服务,从而实现故障自动切换。
二、环境准备
假设我们有两台服务器,分别作为Nginx反向代理服务器的主节点和备节点,后端还有多台Web服务器提供实际的服务。具体的服务器信息如下:
Nginx主节点:192.168.1.10
Nginx备节点:192.168.1.11
虚拟IP:192.168.1.20
后端Web服务器:192.168.1.100、192.168.1.101、192.168.1.102
在开始部署之前,确保所有服务器都安装了操作系统(如CentOS 7),并且关闭了防火墙和SELinux,以避免对网络通信造成干扰。
三、安装与配置
(一)安装Nginx
更新系统软件包:在主节点和备节点上,首先更新系统软件包,确保系统是最新状态。使用命令:
yum update
安装编译依赖:Nginx的编译安装需要一些依赖库,使用以下命令安装:
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载Nginx安装包:从Nginx官方网站下载适合的安装包,例如:
wget http://nginx.org/download/nginx-1.20.2.tar.gz
解压安装包:将下载的安装包解压到指定目录,例如:
tar -zxvf nginx-1.20.2.tar.gz
编译安装Nginx:进入解压后的目录,进行编译和安装。执行以下命令:
cd nginx-1.20.2 ./configure --prefix=/usr/local/nginx --with-http_ssl_module make make install
(二)配置Nginx
在主节点和备节点上,对Nginx进行相同的反向代理和负载均衡配置。编辑Nginx的主配置文件/usr/local/nginx/conf/nginx.conf
,添加以下内容:
http { upstream backend_servers { server 192.168.1.100; server 192.168.1.101; server 192.168.1.102; } server { listen 80; server_name your_domain.com; # 替换为你的域名或IP location / { proxy_pass http://backend_servers; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } } }
(三)安装Keepalived
在主节点和备节点上,使用以下命令安装Keepalived:yum install -y keepalived
(四)配置Keepalived
主节点配置:在主节点(192.168.1.10)上,编辑Keepalived的配置文件
/etc/keepalived/keepalived.conf
,添加以下内容:
global_defs { notification_email { your_email@example.com # 接收通知的邮箱 } notification_email_from keepalived@example.com smtp_server 127.0.0.1 # 邮件服务器地址 smtp_connect_timeout 30 router_id NGINX_MASTER # 机器标识 } vrrp_instance VI_1 { state MASTER interface eth0 # 绑定的网卡 virtual_router_id 51 # 虚拟路由器ID advert_int 1 # 检查间隔,单位秒 authentication { auth_type PASS auth_pass your_password # 认证密码 } virtual_ipaddress { 192.168.1.20 # 虚拟IP } }
备节点配置:在备节点(192.168.1.11)上,编辑Keepalived的配置文件
/etc/keepalived/keepalived.conf
,与主节点配置类似,但有一些关键区别:
global_defs { notification_email { your_email@example.com } notification_email_from keepalived@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_BACKUP } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 advert_int 1 authentication { auth_type PASS auth_pass your_password } virtual_ipaddress { 192.168.1.20 } priority 90 # 优先级低于主节点 }
(五)编写Nginx状态检测脚本
为了确保Nginx服务出现故障时能够及时切换,我们需要编写一个检测脚本,用于检测Nginx进程是否正常运行。在主节点和备节点上,创建脚本文件/etc/keepalived/check_nginx.sh
,内容如下:
#!/bin/bash count=$(ps -C nginx --no-header | wc -l) if [ $count -eq 0 ]; then systemctl restart nginx sleep 2 new_count=$(ps -C nginx --no-header | wc -l) if [ $new_count -eq 0 ]; then systemctl stop keepalived fi fi
设置脚本权限:chmod +x /etc/keepalived/check_nginx.sh
(六)在Keepalived中关联检测脚本
在/etc/keepalived/keepalived.conf
文件的vrrp_instance VI_1
部分添加以下内容,使Keepalived能够调用检测脚本:
vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 # 每2秒执行一次脚本 weight -20 # 脚本执行失败(返回非0)则优先级减20 } track_script { check_nginx }
四、启动与测试
(一)启动服务
在主节点和备节点上,分别启动Nginx和Keepalived服务:
systemctl start nginx systemctl start keepalived
并设置开机自启:
systemctl enable nginx systemctl enable keepalived
(二)测试负载均衡
通过浏览器访问虚拟IP(192.168.1.20),多次刷新页面,观察请求是否在后端的Web服务器(192.168.1.100、192.168.1.101、192.168.1.102)之间均匀分配,以此验证负载均衡功能是否正常。
(三)测试故障自动切换
在主节点上,停止Nginx服务或Keepalived服务,模拟主节点故障。然后再次通过虚拟IP访问Web服务,检查是否能够自动切换到备