nginx集群系列(一):结合keepalived搭建主从模式的nginx集群

艺帆风顺 发布于 2025-04-02 62 次阅读


一、基本概念

    Nginx集群是通过将多个Nginx服务器组合在一起,以协同工作来处理和分发传入的网络流量和请求的系统。集群中的每个Nginx节点都负责处理一部分请求,从而分担负载,提高性能、可伸缩性和可用性。Nginx集群通常用于构建高效的、分布式的Web应用架构。

二、基础环境

    nginx 版本:俩台服务器同版本v1.25.3

[root@DB-Slave ~]# nginx -Vnginx version: nginx/1.25.3built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1d  10 Sep 2019TLS SNI support enabledconfigure arguments: --without-http_gzip_module --with-http_ssl_module --with-http_stub_status_module --with-http_v2_module --with-file-aio --with-openssl=/usr/local/gmssl --with-cc-opt=-I/usr/local/gmssl/include --with-ld-opt=-lm

    Nginx-Master:192.168.1.137

    Nginx-Slave:   192.168.1.138

    虚拟IP(用户实际访问IP):192.168.1.50

    俩台服务器的前端文件保持一致。

三、配置流程

1、安装keepalived工具

2、配置keepalived,主要是权重优先级pri不同

    Master上keepalived配置如下:

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 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着 authentication { # 心跳检测需要的密码 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.50 # VRRP H 虚拟地址 }}

 Slave上keepalived配置如下:

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.1.50 # VRRP H 虚拟地址 }}

3、配置nginx服务检测脚本

    vim /usr/local/src/nginx_check.sh

#!/bin/bashA=`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 fifi

或者使用

#!/bin/bash
while true; do # 检测Nginx进程 nginx_process_count=$(ps -C nginx --no-header |wc -l)
# 判断Nginx进程是否存在 if [ $nginx_process_count -eq 0 ]; then echo "Nginx进程不存在,正在停止keepalived.service服务..." systemctl stop keepalived.service break # 退出循环,因为服务已被停止 else echo "Nginx进程存在,正在启动keepalived.service服务..." systemctl start keepalived.service break # 退出循环,因为服务已被启动 fi
sleep 2 # 暂停2秒钟再次检测done

使该脚本保持后台运行监测:nohup sh nginx_check.sh &

4、重启keepalived和nginx

systemctl start keepalived.servicesystemctl restart keepalived.servicesystemctl status keepalived.servicenginx -s reload

四、验证测试

    1、确认2台主机keepalived和nginx都属于启动状态,并查看网卡信息。

      可以发现当前master主机的IP地址为192.168.1.138

2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:2f:20:61 brd ff:ff:ff:ff:ff:ff    inet 192.168.1.138/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33       valid_lft 1717sec preferred_lft 1717sec    inet 192.168.1.50/32 scope global ens33       valid_lft forever preferred_lft forever    inet6 fe80::ab04:d981:54a0:9f52/64 scope link noprefixroute        valid_lft forever preferred_lft forever

    模拟Master宕机,# poweroff

    此时再次查看192.168.1.137信息,可以发现137主机称为Master

2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:f1:24:91 brd ff:ff:ff:ff:ff:ff    inet 192.168.1.137/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33       valid_lft 1376sec preferred_lft 1376sec    inet 192.168.1.50/32 scope global ens33       valid_lft forever preferred_lft forever    inet6 fe80::ab04:d981:54a0:9f52/64 scope link tentative noprefixroute dadfailed        valid_lft forever preferred_lft forever    inet6 fe80::460b:fc4:bde5:73ec/64 scope link noprefixroute        valid_lft forever preferred_lft forever

  2、模拟Master-2:192.168.1.138恢复

        可以看到192.168.1.138重新成为Master

    证明故障移配置完成。

五、小结

    本篇内容keepalived结合nginx实现故障转移的前提条件时俩个服务都挂掉,比如服务器宕机的情况发生,方能实现故障转移。

    如果只是单独的nginx挂掉,则会通过脚本重启nginx,而不会实现故障转移。