🌐 Nginx 高可用集群(双机热备)

Nginx 高可用集群主要依赖于两台 Nginx 服务器作为反向代理。当其中一台宕机时,另一台会接管工作。为了实现这种机制,两台服务器之间使用 keepalived 进行心跳检测。


一个ingress 怎么负载两个server 一台服务器装两个nginx_运维


🛠️ 如何配置


📌 1. 环境要求

  • 两台已安装了 Nginx 和 keepalived 的 Linux 服务器。

📌 2. 准备工作

  • 需要两台服务器,IP 地址分别为:192.168.17.129 和 192.168.17.131。
  • 在两台服务器上安装 Nginx。
  • 在两台服务器上安装 keepalived。

📌 3. 安装 keepalived

yum install keepalived -y

安装完成后,keepalived 的配置文件位于 /etc/keepalived/keepalivec.conf


📌 4. 高可用配置


🔹 主从配置

修改 /etc/keepalived/keepalivec.conf 配置文件。配置内容如下:

global_defs {
	 notification_email {
		 acassen@firewall.loc
		 failover@firewall.loc
		 sysadmin@firewall.loc
	 }
	 notification_email_from Alexandre.Cassen@firewall.loc
	 smtp_server 192.168.17.129
	 smtp_connect_timeout 30
	 # 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
	 router_id LVS_DEVEL  
}

vrrp_script chk_http_port {
	 script "/usr/local/src/nginx_check.sh"	 # 执行脚本所在的位置
	 interval 2 	#检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
	 weight 2
}
	
vrrp_instance VI_1 {
	 state MASTER	 # 备份服务器上将 MASTER 改为 BACKUP
	 interface ens33	 # 绑定的网卡
	 virtual_router_id 51	 # 主、备机的 virtual_router_id 必须相同
	 priority 90 	# 主、备机取不同的优先级,主机值较大,备份机值较小
	 advert_int 1 	#每隔一秒发送一次心跳,确保从服务器是否还活着
	 authentication {		# 心跳检测需要的密码
		 auth_type PASS
		 auth_pass 1111
 	}
	 virtual_ipaddress {
	 192.168.17.50 	# VRRP H 虚拟地址
	 }
}

🔹 心跳检测脚本

/usr/local/src 目录下创建检测脚本 nginx_check.sh,内容如下:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
 /usr/local/nginx/sbin/nginx 	#Nginx启动命令的位置
 sleep 2
 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
 killall keepalived
 fi
fi

🔹 启动服务

启动 nginx:	./nginx
启动 keepalived:	systemctl start keepalived.service

🔹 可以使用ipconfig,查看虚拟Ip的绑定

一个ingress 怎么负载两个server 一台服务器装两个nginx_运维_02


📌 5. 最终测试

  1. 在浏览器中输入虚拟 IP 地址 192.168.17.50,应该可以正常访问。
  2. 停止主服务器(192.168.17.129)上的 Nginx 和 keepalived,再次访问 192.168.17.50,依然应该可以正常访问。

一个ingress 怎么负载两个server 一台服务器装两个nginx_运维_03

以上就是 Nginx 高可用集群的配置方法。通过这种方法,即使其中一台服务器出现故障,我们的服务仍然可以正常运行,大大提高了服务的稳定性和可靠性。


🌐 Nginx 高可用集群部署指南

Nginx 的高可用集群(双机热备)是确保当主 Nginx 服务器出现问题时,备份 Nginx 服务器可以立即接管,确保服务的连续性。常用的工具是 keepalived,它提供了 VRRP 协议的实现以及健康检查功能。

以下是 Nginx 高可用集群的部署步骤:


1. 📋 环境准备:


📌 1.1 选择适当的服务器:

确保选择的两台服务器都能够支持所需的工作负载,并且硬件、网络和存储配置相似。

这三台机器在高可用 Nginx 集群中的角色如下:

  1. 192.168.1.10 (Master):
  • 这是主 Nginx 服务器。
  • 在正常情况下,所有流量都会首先路由到此服务器。
  • 它持有虚拟 IP (VIP) 192.168.1.100,除非它宕机或存在其他问题。
  1. 192.168.1.11 (Backup):
  • 这是备用 Nginx 服务器。
  • 当 Master 服务器宕机或出现其他问题时,它将接管虚拟 IP 192.168.1.100,从而确保流量继续正常流入。
  • 它始终处于待机状态,随时准备在需要时接管 VIP。
  1. 192.168.1.100 (Virtual IP or VIP):
  • 这是虚拟 IP 地址,通常不与任何实际的物理机器绑定。
  • 在正常情况下,此 IP 地址将指向 Master 服务器。
  • 如果 Master 服务器出现故障,此 IP 地址将迅速切换到 Backup 服务器。
  • 使用此技术,可以确保即使其中一台服务器宕机,流量也不会中断,从而实现高可用性。
  • 192.168.1.100(VIP)需要通过 keepalived 服务进行配置,使其在 Master 和 Backup 服务器之间进行切换

简而言之,192.168.1.10 是主服务器,192.168.1.11 是备用服务器,而 192.168.1.100 是虚拟 IP,可以在两台服务器之间迅速切换,以确保高可用性。


📌 1.2 设置服务器:

  • 对于两台服务器(Master 和 Backup):
  • 安装您选择的 Linux 发行版。以 CentOS 为例:
# 从官方网站下载 CentOS ISO 并安装
  • 为每台服务器分配一个静态 IP 地址:
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0

修改以下内容:

BOOTPROTO=static
IPADDR=192.168.1.10  # 对于 Backup 服务器, 使用 192.168.1.11
NETMASK=255.255.255.0

然后重启网络服务:

sudo systemctl restart network

📌 1.3 网络配置:

  • 确保两台服务器都位于同一网络子网上,并且可以相互通信:
ping 192.168.1.11  # 在 Master 上测试
ping 192.168.1.10  # 在 Backup 上测试

📌 1.4 安装必要的软件:

  • 安装一个文本编辑器(例如 vim):
sudo apt install vim  # 对于 Ubuntu/Debian
sudo yum install vim  # 对于 CentOS/RedHat
  • 更新系统并安装其他必要的依赖项:
sudo apt update && sudo apt upgrade -y  # 对于 Ubuntu/Debian
sudo yum update -y  # 对于 CentOS/RedHat

📌 1.5 防火墙和安全性:

  • 如果启用了防火墙,确保允许 HTTP、HTTPS 和 VRRP 通信:
sudo systemctl stop firewalld  # CentOS/RedHat
sudo systemctl disable firewalld
sudo ufw disable  # Ubuntu/Debian
  • 如果您不希望关闭 SELinux,但要确保 Nginx 或 keepalived 的正常运行:
sudo setsebool -P httpd_can_network_connect 1  # 允许 Nginx 进行网络连接

2. 📁 目录结构和文件准备:


📌 2.1 创建目录结构:

为了组织 Nginx 的内容和配置,我们将创建一个特定的目录结构:

sudo mkdir -p /var/www/nginx/{html,conf,certs}

此命令将创建以下目录结构:

  • /var/www/nginx/html:存储静态内容,如 HTML、CSS、JS 文件等。
  • /var/www/nginx/conf:存储 Nginx 的特定配置文件。
  • /var/www/nginx/certs:存储 SSL/TLS 证书和私钥。

📌 2.2 SSL/TLS 准备:

如果您计划使用 SSL/TLS,确保您已经获得了证书和私钥。这些文件通常由证书颁发机构 (CA) 提供。一旦您有了这些文件,您需要将它们复制到 /var/www/nginx/certs 目录。

sudo cp /path/to/your/certificate.crt /var/www/nginx/certs/
sudo cp /path/to/your/private.key /var/www/nginx/certs/

请确保将 /path/to/your/certificate.crt/path/to/your/private.key 替换为您的证书和私钥的实际路径。


📌 2.3 设置适当的权限:

为了确保文件的安全性,我们应该为这些文件设置适当的权限:

sudo chmod -R 755 /var/www/nginx/html
sudo chmod 640 /var/www/nginx/certs/*

这确保了静态内容对所有用户都是可读的,而证书和私钥则仅对拥有者和所属组可读。


3. 🔒 安全准备:


📌 3.1 创建非 root 用户:

为了避免直接使用 root 用户进行日常任务,我们应该创建一个新的非 root 用户,并为其设置一个强密码。

sudo adduser admin_user
sudo passwd admin_user

该命令会提示您为新用户 admin_user 设置密码。请确保选择一个强大且难以猜测的密码。


📌 3.2 为用户赋予权限:

为了管理服务器,您可能需要为新用户提供一些特定的 sudo 权限。要这样做,您可以将其添加到 sudo 组(这在大多数 Linux 发行版上都适用):

sudo usermod -aG sudo admin_user

现在,admin_user 可以使用 sudo 命令执行需要管理员权限的任务。


📌 3.3 Nginx 和 keepalived 的权限设置:

  • Nginx:

Nginx 默认会以非 root 用户 nginxwww-data (取决于您的发行版)运行工作进程。这已经是一个很好的安全实践,因为它限制了 Nginx 可以访问的系统资源。

  • keepalived:

keepalived 默认情况下需要 root 权限才能运行,因为它需要能够更改系统的网络配置。但是,您应该确保 keepalived 的配置文件只能由 root 用户读取和写入,以防止任何不当的更改。

sudo chmod 600 /etc/keepalived/keepalived.conf

此命令将确保只有 root 用户可以读取和写入 keepalived 的配置文件。


📌 3.4 设置防火墙规则:

如果您使用的是 UFW 或 Firewalld 防火墙,您可能需要允许 HTTP、HTTPS 和 VRRP 通信:

UFW(Ubuntu/Debian):

sudo ufw allow http
sudo ufw allow https
sudo ufw allow 5400/udp

Firewalld(CentOS/Red Hat):

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=5400/udp
sudo firewall-cmd --reload

现在,您的服务器已经为安全运行 Nginx 和 keepalived 做好了准备。您可以继续部署和配置这些服务。


4. 🚀 安装 Nginx:

📌 4.1 在两台服务器上安装 Nginx:

确保您已经登录到每台服务器,然后执行以下命令来安装 Nginx:

sudo apt update
sudo apt install nginx -y

📌 4.2 启动 Nginx 服务:

在安装完成后,启动 Nginx 服务并使其在启动时自动运行:

sudo systemctl start nginx
sudo systemctl enable nginx

📌 4.3 检查 Nginx 服务状态:

为了确保 Nginx 正确安装并正在运行, 您可以检查其服务状态:

sudo systemctl status nginx

这应该会显示 Nginx 服务正在运行的信息。


📌 4.4 配置 Nginx:

让我们为 Nginx 创建一个简单的配置。首先,备份默认的配置文件:

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

然后,使用文本编辑器打开配置文件:

sudo nano /etc/nginx/nginx.conf

对于简单的反向代理设置,您可以使用以下配置:

http {
    upstream backend {
        server 192.168.1.10;  # Master Server IP
        server 192.168.1.11;  # Backup Server IP
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

保存并退出文本编辑器。


📌 4.5 测试 Nginx 配置:

每次更改 Nginx 配置后,都应该测试配置以确保没有语法错误:

sudo nginx -t

如果测试成功,您将看到 syntax is okaytest is successful 的消息。


📌 4.6 重新加载 Nginx 服务:

为了应用新的配置更改, 重新加载 Nginx:

sudo systemctl reload nginx

现在, Nginx 应该已经正确配置并正在运行。您可以在浏览器中输入服务器的 IP 地址来测试配置。如果一切正常,您应该看到 Nginx 的默认欢迎页面或您的应用服务器的页面(如果已配置)。


5. 🔧 安装 keepalived:

在两台服务器上都安装 keepalived:

sudo apt install keepalived

6. 🛠️ 配置 keepalived:


📌 Master 服务器:

编辑 /etc/keepalived/keepalived.conf:

sudo nano /etc/keepalived/keepalived.conf

加入以下配置:

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 根据你的网络接口进行修改
    virtual_router_id 51
    priority 100  # 主服务器的优先级要比备用服务器高
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24  # VIP 地址
    }
    track_script {
        chk_nginx
    }
}

📌 Backup 服务器:

编辑 /etc/keepalived/keepalived.conf:

sudo nano /etc/keepalived/keepalived.conf

加入以下配置:

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 根据你的网络接口进行修改
    virtual_router_id 51
    priority 50  # 备份服务器的优先级低于主服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24  # VIP 地址
    }
    track_script {
        chk_nginx
    }
}

7. 🔄 启动服务:

在两台服务器上都启动 Nginx 和 keepalived:

sudo systemctl start nginx
sudo systemctl start keepalived

8. 🧪 测试:


📌 8.1 Ping 虚拟 IP:

首先, 从第三台机器(或您的本地机器)尝试 ping 虚拟 IP 192.168.1.100 来验证其可达性:

ping 192.168.1.100

您应该能够看到 ICMP 回应,表示 IP 地址是活跃的。


📌 8.2 测试 Master 服务器的故障切换:

为了模拟一个故障的情况,我们将停止 Master 服务器上的 Nginx:

sudo systemctl stop nginx

现在, 从第三台机器再次 ping 虚拟 IP:

ping 192.168.1.100

即使 Master 服务器上的 Nginx 已经停止,您仍然应该能够得到 ping 的响应。这意味着 Backup 服务器已经成功接管了虚拟 IP。


📌 8.3 观察切换:

为了更详细地观察发生了什么,您可以在 Backup 服务器上检查 keepalivednginx 的日志。

sudo journalctl -u keepalived
sudo journalctl -u nginx

keepalived 的日志中,您应该能够看到有关接管虚拟 IP 的消息。

这些测试确保了当 Master 服务器出现故障时,Backup 服务器能够迅速接管虚拟 IP 并继续为用户提供服务,从而确保了高可用性。


9. 🌐 如何访问:

  1. 🌍 通过 Web 浏览器:
  • 打开您的 web 浏览器并在地址栏输入:
http://192.168.1.100
  • 如果 Nginx 服务器配置为提供某些网页或应用程序,您应该能够看到它们。
  1. 💻 通过命令行:
  • 使用 curl 命令来检测响应:
curl http://192.168.1.100
  1. 🔍 验证当前服务的服务器:
  • 虽然您使用的是 VIP 192.168.1.100,但您可能还想知道当前为您提供服务的是哪台服务器(Master 还是 Backup)。
  • 为此,您可以在 Nginx 的配置中设置一个自定义的 HTTP 头部,例如 X-Served-By,其值是服务器的主机名或 IP 地址。这样,每次您请求页面时,都可以通过查看响应的 HTTP 头部来确定是哪台服务器为您提供服务。
  1. 🔥 高可用性测试:
  • 为了测试高可用性,您可以尝试关闭 Master 服务器或其上的 Nginx 服务,并再次访问 http://192.168.1.100
  • 您应该没有中断地继续接收服务,这表明 Backup 服务器已经接管并为您提供服务。

📌 注意: 为了使这种高可用性配置在生产环境中有效,您需要确保应用程序、数据库等其他组件也具有高可用性。此外,确保两台服务器的 Nginx 配置是同步的,并且任何更改都应该同时应用到两台服务器上。