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

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


一、基本概念

    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,而不会实现故障转移。