nginx高并发架构

news2024/10/7 6:45:55

1.前言

对于高并发的流量web架构,单纯的使用nginx是不够用的,nginx做七层代理需要处理数据,在大并发的情况下对主机资源的消耗就非常厉害了,所以此情况下就引入了lvs,使用lvs的四层转发功能,四层转发不需要处理数据只是tcp/udp协议进行端口对端口的数据转发,就算并发在大也不存在资源消耗大的问题,再通过多个nginx进行负载,就能很好的应对高并发的问题,在通过引入keepalived解决lvs单点问题,实现高可用

lvs的负载均衡可以实现后端检查,若是后端的某个nginx挂掉时,会将该nginx地址从负载均衡中剔除,当该nginx恢复后,又会将该地址加入到负载均衡中

lvs的网络模式使用DR模式,负载均衡策略使用rr轮询模式

2.架构

3.主机信息

nameipportservice
A(主)10.1.60.11580

ipvs、keepalived

B(备)10.1.60.11880ipvs、keepalived
C10.1.60.11280nginx
D10.1.60.11480nginx
VIP10.1.60.116

4.部署

所有主机关闭selinux与firewalld

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

以下操作在A、B主机上执行

安装keepalived服务

yum -y install keepalived

备份keepalived原配置文件

cp  /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

编辑keepalived配置文件

vi /etc/keepalived/keepalived.conf

A主配置文件

! Configuration File for 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.200.1
   smtp_connect_timeout 30
   router_id nginx01          #配置路由id,主和备的配置需要配置不同的id
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER             #主需要设置为MASTER
    interface ens160         #配置网卡,需要根据自己的真实网卡名称配置
    virtual_router_id 51     #配置vrrp的路由id,主和备需要相同
    priority 100             #配置权重值,备节点权重值需要低于MASTER节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.116/24        #设置虚拟ip地址
    }
}

virtual_server 10.1.60.116 80 {     #配置虚拟ip地址和端口,用于接收转发请求
    delay_loop 3                     #定义检测真实服务器可用性的循环周期,单位为秒
    lb_algo rr                       #配置负载均衡的访问策略,配置问轮询模式
    lb_kind DR                       #配置ipvs使用的网络模式,配置为路由模式
    persistence_timeout 0            #定义持久化连接的超时时间,单位为秒。持久化连接可以确保同一个客户端的多个请求都被转发到同一台真实服务器
    protocol TCP                     #指定后端真实服务器的协议为 TCP

    real_server 10.1.60.114 80 {    #配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
        weight 1                     #配置权重,权重大的转发流量就多
        HTTP_GET {                   #配置健康检查
            url {
              path /
              status 200
            }
            connect_timeout 3        #配置检查超时时间
            nb_get_retry 3           #定义在失败的情况下重新尝试的次数
            delay_before_retry 3     #定义重新尝试之间的延迟时间,单位为秒
        }
    }


     real_server 10.1.60.112 80 {   ##配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

B备配置文件

! Configuration File for 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.200.1
   smtp_connect_timeout 30
   router_id nginx02            #更改id与主不一致
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP            #更改为BACKUP
    interface ens160
    virtual_router_id 51   
    priority 90              #更改配置权重
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.116/24
    }
}

virtual_server 10.1.60.116 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.1.60.114 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

     real_server 10.1.60.112 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

启动keepalived服务并配置开机启动

systemctl start keepalived

systemctl enable keepalived

查看A主机地址

可以看到vip地址绑到了A主机上

以下操作在C、D主机上执行

安装nginx服务

yum -y install epel   #通过epel的包去安装nginx

yum -y install nginx

更改nginx的默认页面

mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak

D主机则将C改为D即可

echo "this is C" >> /usr/share/nginx/html/index.html

启动nginx服务并配置开机启动

systemctl start nginx

systemctl enable nginx

新增虚拟网卡并配置为vip地址,用于返回数据,并且不会被用户访问到,lo虚拟网卡中的127.0.0.1就属于回环地址,不会被外部访问,参照lo虚拟网卡配置

cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo1

vi /etc/sysconfig/network-scripts/ifcfg-lo1

DEVICE=lo:1   #网卡修改名称
IPADDR=10.1.60.116   #配置为vip地址
NETMASK=255.255.255.255   #更改为32位子网掩码
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

重启网络服务

systemctl restart network

ip add

 添加路由

route add -host 10.1.60.116 dev lo:1   #若是需要删除将add替换为del即可

查看路由

route -n

配置arp响应与通告

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

使配置生效 

sysctl -p

 在A、B主机上执行以下命令

安装ipvsadm工具

yum -y install ipvsadm

查看ipvs规则

ipvsadm -Ln

 可以看到ipvs规则中显示10.1.60.116:80地址通过rr轮询负载到后端的10.1.60.112:80、10.1.60.114:80两个nginx地址中

5.测试

访问vip地址和端口看看是否能正常转发到后端的两个nginx中

curl 10.1.60.116

可以看到访问 vip地址是可以正常轮询访问到后端的两个nginx中

再来测试一下lvs的负载均衡健康检测功能

将C主机的nginx 80监听端口更改为81

vi /etc/nginx/nginx.conf

 优雅重载nginx配置文件

nginx -s reload

查看A、B主机的keepalived状态与ipvs规则

systemctl status keepalived

ipvsadm -Ln

 可以看到lvs检测到C主机的nginx 80端口有问题就把C主机节点从负载均衡中剔除了

我们现在把C主机的nginx81端口恢复回80端口看看是否会重新加入负载均衡列表

nginx -s reload

 查看keepalived状态和ipvs规则

systemctl status keepalived

ipvsadm -Ln

可以看到C主机的80端口恢复后,lvs将该节点恢复到了负载均衡列表中

再来测试一下keepalived的高可用

 将A主机的keepalived服务停止

systemctl stop keepalived

查看B主机的keepalived服务状态

systemctl status keepalived

ip add |grep ens160

 测试访问vip地址

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

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

相关文章

【MySQL】如何优化SQL查询的总体框架(详细版,关于如何优化数据库服务器从大到小详细说明了步骤)

文章目录 1 数据库服务器的优化步骤2 观察2.1 观察系统总体运行情况2.2 定位执行慢的 SQL:慢查询日志2.3 查看 SQL 执行成本:SHOW PROFILE2.4 分析查询语句:EXPLAIN(重点掌握)2.4.1 EXPLAIN各列作用2.4.2 EXPLAIN 的 t…

银行安全用电监管平台可行性研究及解决方案

2017年4月26日,国务院安全生产委员会印发《国务院安全生产委员会关于开展电气火灾综合治理工作的通知》(安委〔2017〕4号),强调用三年时间综合治理电气火灾工作,提高社会单位发现和处置消防电气安全隐患能力&#xff0…

2023国自然会评:上会及分数解析,这几种情况本子容易被拿下?

国自然基金上会标准 今年的会评已经临近“重头戏”---面青地项目会议评审。 在国自然会评中,通过函评筛选出的科研工作者,经过会评筛选和评审,最终被评选出的项目将获得国自然会的资金支持。 国自然的会评,分为几个部分&#x…

美国访问学者怎么考驾照?

作为一个美国访问学者,你可能会想知道在美国如何考取驾照。在这篇文章中,知识人网小编将介绍美国的驾照考试流程和一些相关要求。 首先,作为一名访问学者,你需要了解美国各州对驾照的规定可能会有所不同。因此,在考取驾…

单片机尽力少用位域操作

1、在51单片机中少用uint32_t类型,查看汇编真的好多条指令,尽力避免少用。 2、在32位单片机中,u8、u16、u32类型操作起来基本没有什么影响,下图是我做的测试,可能测试不全面,按照当前测试,在32…

CVE-2023-28432-MinIO集群模式信息泄露漏洞流量分析

简介 MinIO是一个开源对象存储系统。 在其RELEASE.2023-03-20T20-16-18Z版本(不含)以前,集群模式部署下存在一处信息泄露漏洞,攻击者可以通过发送一个POST数据包获取进程所有的环境变量,其中就包含账号密码MINIO_SEC…

ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用

0. 前言 终于!终于!自个翻遍了网上的文章,加上对官网的文档和API的翻找,终于明白这玩意到底更新出了个啥出来! 本文章会带你了解,使用 SpringDataES5.1 对 ES8.7 的【新增、修改、删除、多条件查询、聚合】…

MFC 工具栏中的按钮控件下拉式

有一个需求 工具栏中的按钮需要有一个下拉按钮,点击下拉按钮可以弹出一个子窗口来选择 显示该 TBSTYLE_EX_DRAWDDARROWS 扩展的样式设置,将箭头下方将显示。 DWORD dwExStyle TBSTYLE_EX_DRAWDDARROWS; m_toolbar.GetToolBarCtrl().SendMessage(TB_SE…

「深度学习之优化算法」(十一)鲸鱼算法

1. 鲸鱼算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   鲸鱼算法(Whale Optimization Algorithm)是根据鲸鱼围捕猎物的行为而提出的算法。鲸鱼是一种群居的哺乳动物,在捕猎时它们也会相互合作对猎物进行驱赶和围捕。鲸鱼算法提出时间并不长,也是一个新兴…

利用Gradio的UploadButton模块实现文件上传功能

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

requestAnimationFrame性能测试

requestAnimationFrame:每次重绘最多只调用一次回调函数 测试开启/关闭requestAnimationFrame的监听事件调用次数差异: 先说结论:存在约8倍的调用次数差距! requestAnimationFrame使用与否的次数差距 本次测试代码为drag事件 c…

Pycharm设置Python文件页眉默认信息(作者姓名、创建时间等)

次点击File->Settings->Editor->File and Code Templates->然后选择Python script. 后将下列代码复制到右边的框框中,然后选择apply应用,就可以啦 ##!/usr/bin/python3 # -*- coding: utf-8 -*- # Time : ${DATE} ${TIME} # Author : 作者…

【CSS加载动画特效】28种纯CSS实现的加载loading动态特效(附源码)

文章目录 写在前面涉及知识点效果展示1、Loading节点的创建2、部分效果的实现源码1)三点加载动画Html代码CSS样式代码 2)圆点矩阵加载特效Html代码CSS样式代码 3)圆形轨迹加载动画Html代码Css样式代码 4)栅栏式加载动画Html代码Cs…

Qt/C++音视频开发46-音视频同步保存到MP4

一、前言 用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随…

python对dataframe索引的操作

目录 假如有个dataframe如下,这里需要去除第一个aa,保留最后一个aa 关键代码 # 如果你想保留第一个aa,那么keep就是first df.reset_index().drop_duplicates(subsetindex, keepfirst).set_index(index)结果如下: 原文链接&am…

10.1.5 查询指令是否为 Bash shell 的内置命令: type

通过 type 这个指令我们可以知道每个指令是否为 bash 的内置指令。 此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以可执行文件的状态被找到, 那么该名称是不会被显示出来的。也就是说, type 主要在找出“可执行文…

3 Prometheus安装

目录 1. 安装Prometheus 2. 基于linux安装Prometheus 下载安装包 将安装包放在合适的目录下 启动prometheus 访问 3. 配置Prometheus 3.1 global 3.2 alerting 3.3 rule_files 3.4 static_configs 4. 第一个指标 5 表达式浏览器 指标列表自动填充 指标名称筛选 指…

pytorch的whl文件安装

下载.whl文件,离线安装 提示:下载torch的稳定版本网址[https://download.pytorch.org/whl/torch_stable.html](https://download.pytorch.org/whl/torch_stable.html) 首先,查看主机显卡和安装的cuda版本。 可以在命令行输入:nvcc -V 如果…

使用jquery遇到的问题Unresolved function or method $()

今天在使用jquery的时候,发现页面中即使引入了jquery.min.js,js代码中仍然说找不到$(),原来的项目也是用的jquery.min.js,为什么之前的就没有这个问题呢。 然后利用搜索引擎查了一下解决方案,最后还是决定改成未压缩版…

触摸按键控制LED灯亮灭

文章目录 前言一、触摸按键介绍二、触摸按键电路原理模式一:模式二: 三、系统设计1、模块框图2、RTL视图 四、源码1、touch_led模块 五、效果六、总结七、参考资料 前言 环境: 1、Quartus18.1 2、vscode 3、板子型号:原子哥开拓者…