Nginx+Keepalive集群实战

news2024/11/24 14:21:52

随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。
Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如果为最前端时单台Nginx会存在单点故障,也就是一台Nginx宕机,会影响用户对整个网站的访问。所以需要加入Nginx备份服务器,Nginx主服务器与备份服务器之间形成高可用,一旦发现Nginx主宕机,能快速将网站恢复至备份主机。Nginx+keepalived网络架构如图23-1所示

3.1. 环境准备:

nginx版本:nginx v1.18.0
keepalive版本:keepalive v1.3.5
Nginx-1:192.168.20.10(master)
Nginx-2:192.168.20.20(backup)

3.2. 安装软件包:

#下载keepalive源码包:
wget https://www.keepalived.org/software/keepalived-1.3.5.tar.gz
#下载nginx源码包:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#解压:
tar -xf keepalived-1.3.5.tar.gz -C /usr/src/
tar -xf nginx-1.18.0.tar.gz -C /usr/src/
#安装依赖包:
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel libnl libnl-devel libnfnetlink libnfnetlink-devel
#创建nginx用户:
useradd -s /sbin/nologin nginx -M
#预编译nginx:
cd /usr/src/nginx-1.18.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
#编译&安装nginx
make && make install
#配置nginx环境变量:
vim /etc/profile
#后面添加如下内容:
export PATH=$PATH:/usr/local/nginx/sbin
  source /etc/profile 
#预编译keepalive:
cd /usr/src/keepalived-1.3.5/
./configure --prefix=/usr/local/keepalived/ --with-kernel-dir=/usr/src/kernels/3.10.0-514.el7.x86_64/
#编译&&安装keepalive:
make && install
#安装完成后,keepalived的默认配置文件地址和我们安装的地址不一样,所以复制过去就可以了
cp /usr/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/
cp /usr/src/keepalived-1.3.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#配置环境变量
vim /etc/profile
#后面添加如下内容:
export PATH=$PATH:/usr/local/keepalived/sbin
  source /etc/profile 

注意:以上的配置master和backup都需要安装

3.3. 配置keepalive:

  • 配置Keepalived,两台服务器keepalived.conf内容都为如下,state均设置为backup,Backup服务器需要修改优先级为90。

vim /etc/keepalived/keepalive.conf
! Configuration File for keepalived
   } 
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}  
vrrp_script chk_nginx {
    script  "/data/sh/check_nginx.sh"
    interval 2 
    weight 2 
 }  
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.20.100
    }   
    track_script {
     chk_nginx 
    } 
}

3.4. 创建脚本:

  • 如上配置还需要建立check_nginx脚本,用于检查本地Nginx是否存活,如果不存活,则kill keepalived实现切换。其中check_nginx.sh脚本内容如下

#创建存放脚本路径:
mkdir -p /data/sh/
#创建脚本:
vim /data/sh/check_nginx.sh
#!/bin/bash 
#auto  check  nginx  process 
#2020年9月15日17:16:29
#by  author  XiaoYuEr 
killall  -0   nginx
if  [[ $? -ne 0 ]];then 
service keepalived stop
fi
chmod +x /data/sh/check_nginx.sh
##killall这个命令没有需要安装psmisc-22.20-15.el7.x86_64即可
注意:这个脚本需要两台电脑都需要创建
启动keepalive时可能会遇到以下报错:

systemd: PID file /usr/local/keepalived/var/run/keepalived.pid not readable (yet?) after start.
#这时需要修改keepalived.service文件把pid路径修改一下就可以了
vim /lib/systemd/system/keepalived.service
#修改为以下内容即可:
PIDFile=/var/run/keepalived.pid

3.5. 测试:

  • 在两台Nginx服务器分别新建index.html测试,一台nginx挂掉是否还可以访问:

#在master中配置index.html
[root@localhost ~]# echo "this is 192.168.20.10 page" > /usr/local/nginx/html/index.html
#在backup机器中配置index.html
echo "this is 192.168.20.20 page" > /usr/local/nginx/html/index.html
打开浏览器访问192.168.20.100:

把master主机nginx关掉再次访问看下:

3.6. Keepalived配置文件参数详解:
完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。

[全局定义块]
global_defs {
      notification_email {                           --指定keepalived在发生切换时需要发送email到的对象,一行一个;
         wgkgood@gmail.com                          
      }    
     notification_email_from  root@localhost        --指定发件人
     smtp_server  127.0.0.1                           --指定smtp服务器地址
     smtp_connect_timeout 3                          --指定smtp连接超时时间
     router_id LVS_DEVEL                             --运行keepalived机器的标识
}    
[监控Nginx进程]            
vrrp_script    chk_nginx  {    
    script "/data/script/nginx.sh"                  --监控服务脚本,脚本x执行权限;
    interval 2                                        --检测时间间隔(执行脚本间隔)
    weight 2                                        --权重
}                
[VRRP实例定义块]                
vrrp_sync_group VG_1{                                --监控多个网段的实例
        group {                 
  VI_1                                                 --实例名1
  VI_2    
 }    
 notify_master /data/sh/nginx.sh                      --指定当切换到master时,执行的脚本
 notify_backup /data/sh/nginx.sh                      --指定当切换到backup时,执行的脚本
 notify   /data/sh/nginx.sh                            --发生任何切换,均执行的脚本
 smtp_alert                                         --使用global_defs中提供的邮件地址和smtp服务器发送邮件通知;
}        
vrrp_instance VI_1 {        
    state BACKUP                                    --设置主机状态,MASTER|BACKUP
    nopreempt                                       --设置为不抢占
interface eth0                                       --对外提供服务的网络接口
lvs_sync_daemon_inteface eth0                       --负载均衡器之间监控接口; 
    track_interface {                                --设置额外的监控,网卡出现问题都会切换;
     eth0    
     eth1    
    }    
    mcast_src_ip                                    --发送组播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay                                  --在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50                            --VRID标记 ,路由ID,可通过#tcpdump vrrp查看
    priority 90                                        --优先级,优先级高者竞选为master
    advert_int 5                                    --检查间隔,默认5秒
    preempt_delay                                   --抢占延时,默认5分钟
    debug                                           --debug日志级别
    authentication {                                --设置认证
        auth_type PASS                              --认证方式
        auth_pass 1111                              --认证密码
    }
    track_script {                                  --以脚本为监控chk_nginx;
        chk_nginx        
    }        
    virtual_ipaddress {                             --设置vip地址
        192.168.111.188
    }
}
注意:使用了脚本监控Nginx或者MYSQL,不需要下面虚拟服务器设置块。
[虚拟服务器定义块]
virtual_server 192.168.111.188 3306 {
    delay_loop 6                                      --健康检查时间间隔
    lb_algo rr                                        --调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR                                        --负载均衡转发规则NAT|DR|TUN
    persistence_timeout  5                            --会话保持时间
    protocol TCP                                      --使用的协议
    real_server 192.168.1.12 3306 {    
               weight 1                               --默认为1,0为失效
               notify_up   <string> | <quoted-string> --在检测到server up后执行脚本;
               notify_down <string> | <quoted-string> --在检测到server down后执行脚本;
               TCP_CHECK {
               connect_timeout 3                   --连接超时时间;
               nb_get_retry  1                        --重连次数;
               delay_before_retry 1                 --重连间隔时间;
               connect_port 3306                     --健康检查的端口;
               }
       HTTP_GET {    
       url  {
          path /index.html                         --检测url,可写多个
          digest  24326582a86bee478bac72d5af25089e --检测效验码
          --digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html 
          status_code 200                          --检测返回http状态码
      }
}
}

4. 企业级Nginx+Keepalived双主架构实战
Nginx+keepalived主备模式,始终存在一台服务器处于空闲状态,如何更好的把两台服务器利用起来呢,可以借助Nginx+keepalived双主架构来实现,如图23-2所示,将架构改成双主架构,也即同时两台对外两个VIP地址,同时接收用户的请求。

 

4.1. 环境准备:
nginx版本:nginx v1.18.0
keepalive版本:keepalive v1.3.5
Nginx-1:192.168.20.10(master) (backup)
Nginx-2:192.168.20.20(backup) (master)

4.2. 配置如下:

  • 以下内容是接着上面的配置来完成的。

#以下配置是master端配置的,即192.168.20.10:
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_nginx {
    script  "/data/sh/check_nginx.sh"
    interval 2
    weight 2
 }
#VIP1
vrrp_instance VI_1 {
    state MASTER
    interface ens33
     lvs_sync_daemon_inteface ens33
    virtual_router_id 51
    priority 100
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.20.100
    }
    track_script {
     chk_nginx
    }
}
#VIP2
vrrp_instance VI_2 {
     state BACKUP
     interface ens33
     lvs_sync_daemon_inteface ens33
     virtual_router_id 52
     priority  90
     advert_int 5
     nopreempt
     authentication {
         auth_type  PASS
         auth_pass  2222
     }
     virtual_ipaddress {
         192.168.20.200
     }
     track_script {
     chk_nginx
    }
 }

#backup端配置即:192.168.20.20
! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30

   notification_email {
     acassen@firewall.loc
   } 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}  
vrrp_script chk_nginx {
    script  "/data/sh/check_nginx.sh"
    interval 2 
    weight 2 
 }  
#VIP1
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    lvs_sync_daemon_inteface ens33
    virtual_router_id 51
    priority 90
    advert_int 5
    nopreempt
    authentication {
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.20.100
    }   
    track_script {
     chk_nginx 
    } 
}   
#VIP2
vrrp_instance VI_2 {
     state MASTER  
     interface ens33
     lvs_sync_daemon_inteface ens33
     virtual_router_id  52 
     priority  100
     advert_int 5 
     nopreempt  
     authentication {
         auth_type  PASS
         auth_pass  2222
     }   
     virtual_ipaddress {
         192.168.20.200 
     }   
     track_script {
     chk_nginx 
    } 
 } 

4.3. 测试:

  • 两个VIP在一台服务器,是由于另外一台服务器down机,VIP都漂移到本机网卡下。

[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ec:10:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.10/24 brd 192.168.20.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.20.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.20.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::cbc:47d:6f9d:da7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Nginx+keepalived双主企业架构,在日常维护及管理过程中需要如下几个方面:
Keepalived主配置文件必须设置不同的VRRP名称,同时优先级和VIP设置也各不相同;
Nginx网站总访问量为两台Nginx服务器之和,可以写脚本自动统计访问量;
两台Nginx为Master,存在两个VIP地址,用户从外网访问VIP,需配置域名映射到两个VIP上方可。
通过外网DNS映射不同VIP的方法也称为DNS负载均衡模式; 可以通过Zabbix实时监控VIP访问状态是否正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外仓系统如何为企业提供智能财务解决方案?

在跨境电商的蓬勃发展中&#xff0c;海外仓系统作为连接商品、消费者与财务管理的关键纽带&#xff0c;正逐步演变为企业财务智能化的重要推动力。通过集成先进的技术与智能化功能&#xff0c;海外仓系统不仅优化了仓储物流流程&#xff0c;还为企业提供了全面、高效的智能财务…

基于SpringBoot+Vue的企业档案管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Vue2 和 Vue3 有什么区别?

1. 数据双向绑定的响应式原理不同 vue2 在初始化的时候&#xff0c;对 data 中的每个属性使用 Object.defineProperty() 调用 get 和 set 使之变为响应式对象。 如果属性值为对象&#xff0c;需要递归调用 defineProperty 使之变为响应式对象。 缺陷&#xff1a;Object.define…

分类预测|基于麻雀优化支持向量机的Adaboost集成的数据分类预测Matlab程序SSA-SVM-Adaboost

分类预测|基于麻雀优化支持向量机的Adaboost集成的数据分类预测Matlab程序SSA-SVM-Adaboost 文章目录 一、基本原理SSA-SVM-Adaboost 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 SSA-SVM-Adaboost 分类预测原理和流程 1. 麻雀优化算…

计算机三级 - 数据库技术 - 第十一章 故障管理 笔记

第十一章 故障管理 内容提要: 了解故障管理类型及数据库恢复技术了解数据转储技术了解如何利用日志文件进行数据恢复了解硬件容错方案 11.1 故障管理概述 故障类型及解决方案&#xff1a; 事务内部故障 &#xff1a;导致数据不一致 预期的事务内部故障 &#xff1a; 可通过事…

c++的 stack 和 queue(deque) 和 priority_queue 和 适配器

目录 1.stack和queue 2. queue的介绍和使用 3. priority_queue的介绍和使用 4. 容器适配器 4.1 STL标准库中stack和queue的底层结构 4.2 deque的简单介绍(了解) 4.2.1 deque的原理介绍 4.2.2 deque的缺陷 1.stack和queue 1.1stack 的 结构 1.2 stack 的使用 可以自己查看…

学习Vue3的第四天

目录 pinia 安装 Pinia 存储读取数据 修改数据(三种方式) storeToRefs getters $subscribe store组合式写法 组件通信 props 自定义事件 mitt v-model $attrs $refs、$parent provide、inject slot pinia Pinia 是一个用于 Vue.js 的状态管理库&#xff0c;作…

为工程师构建生成式 AI 应用程序

作为全栈工程师&#xff0c;我们经常需要将后端和前端代码与 AI 模型集成。然而&#xff0c;访问这些模型一直是一项重大挑战。主要障碍之一是缺乏对开放和封闭模型的轻松访问。在 GitHub&#xff0c;我们正在打破访问障碍并推出GitHub Models。让您&#xff08;开发人员&#…

微服务网关终极进化:设计模式驱动的性能与可用性优化(四)

时间&#xff1a;2024年09月12日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真做事的团队&#xff0c;一起努力…

信息安全数学基础(7)最小公倍数

前言 在信息安全数学基础中&#xff0c;最小公倍数&#xff08;Least Common Multiple, LCM&#xff09;是一个重要的概念&#xff0c;它经常与最大公约数&#xff08;Greatest Common Divisor, GCD&#xff09;一起出现&#xff0c;两者在数论、密码学、模运算等领域都有广泛的…

docker-compose 部署 flink

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

黑龙江等保测评:保障数据安全的最佳选择,助力企业无忧发展!

在数字化时代&#xff0c;数据安全已成为企业发展的重中之重。尤其是在黑龙江&#xff0c;随着信息技术的快速发展&#xff0c;数据泄露和网络攻击的风险日益增加。为了帮助企业提升数据安全防护能力&#xff0c;黑龙江等保测评应运而生&#xff0c;成为保障数据安全的有力工具…

DRW的公式推导及代码解析

流程 分阶段指定β值 # 根据当前epoch计算使用的beta值idx epoch // 160 # 每160轮epoch切换一次加权系数betas [0, 0.9999] # 两个beta值beta betas[idx] # 根据idx选择beta值 计算有效样本的权重 对权重进行归一化 &#xff08;每类权重值 / 权重总和&#xff09;* …

第7篇:【系统分析师】计算机网络

考点汇总 考点详情 1网络模型和协议&#xff1a;OSI/RM七层模型&#xff0c;网络标准和协议&#xff0c;TCP/IP协议族&#xff0c;端口 七层&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;…

MBD_入门篇_23_SimulinkSinks

23.1 概述 Sink库里面是Simulink的显示或导出信号数据的模块&#xff0c;可以理解为信号的最后接收的模块&#xff0c;要么用于显示要么用于传递给更上层的系统要么终止。 Sink库里面的模块都只有输入&#xff0c;没有输出。 23.2 回顾常用模块 23.2.1 Display 用于实时仿真…

终端文件管理神器 !!!【送源码】

项目简介 nnn是一款专为命令行爱好者打造的高效终端文件管理器。它以其超小的体积、几乎零配置的要求以及卓越的速度表现而著称。nnn不仅适用于Linux、macOS、BSD等操作系统&#xff0c;还能够在诸如树莓派、Android上的Termux、WSL、Cygwin等多个平台运行。它遵循POSIX标准&am…

EPSG 标识符和Web墨卡托投影的关系

Web 墨卡托投影使用修改版的墨卡托投影,并已成为 Web 制图的默认地图投影。此投影的主要区别在于它在所有尺度上都使用球面公式。而墨卡托投影使用与赤道相切的垂直圆柱投影。以下是 Web 墨卡托投影成为 Web 和在线制图事实上的标准的一些原因。 哪些 Web 地图使用 Web Merca…

从 Data 到 Data + AI,必然之路还是盲目跟风?

从 Data 到 Data AI&#xff0c;必然之路还是盲目跟风&#xff1f; 前言从 Data 到 Data AI 前言 数据和人工智能的发展日新月异&#xff0c;深刻地改变着我们的生活和工作方式。数据平台作为数据处理和分析的核心基础设施&#xff0c;也在不断演进和发展。从数据库时代到大…

Linux系统使用Docker安装DockerUI并实现远程管理本地容器无需公网IP

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

如何用MATLAB搭建ResNet网络(复现论文)

文章目录 前言基础工具网络搭建ResNet网络代码完整代码总结参考文献 前言 之前暑假实习了3个月&#xff0c;后来又赶上开学一堆事&#xff0c;现在终于有时间记录一下学习经历。新的学期开始了&#xff0c;要继续努力。 因为最近要做一个无人机航迹分类的项目&#xff0c;所以…