nginx高并发架构

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地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数学建模】 灰色预测模型

数学建模——预测模型简介 https://www.cnblogs.com/somedayLi/p/9542835.html 灰色预测模型 https://blog.csdn.net/qq_39798423/article/details/89283000?ops_request_misc&request_id&biz_id102&utm_term%E7%81%B0%E8%89%B2%E9%A2%84%E6%B5%8B%E6%A8%…

SQL高级教程

SQL TOP 子句 TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。 注释:并非所有的数据库系统都支持 TOP 子句。 SQL Server 的语法: SELECT TOP number|percent column_name(s) F…

Tensorflow入门(2)——深度学习框架Tesnsflow 线程+队列+IO操作 文件读取案例

目录 一、二、Tesnsflow入门 & 环境配置 & 认识Tensorflow三、线程与队列与IO操作1.队列实例:完成一个出队列、1、入队列操作(同步操作) 2.队列管理器 创建线程3.线程协调器 管理线程案例:通过队列管理器来实现变量加1,入队&#xff…

实操:用Flutter构建一个简单的微信天气预报小程序

​ 微信小程序是一种快速、高效的开发方式,Flutter则是一款强大的跨平台开发框架。结合二者,可以轻松地开发出功能丰富、用户体验良好的微信小程序。 这里将介绍如何使用Flutter开发一个简单的天气预报小程序,并提供相应的代码示例。 1. 准备…

10.25UEC++/小试牛刀(笨鸟先飞案例)

1.思路整理: 如何入手? 角色可能是每个游戏的最重要的部分,所以一般可以先从角色入手,如果游戏很复杂,可以进行拆分设计。 蓝图创建地图: 创建默认Pawn: 编写GameMode默认构造函数:…

【机器人模拟-02】 模拟移动机器人设置里程计

一、说明 在本教程中,我将向您展示如何设置移动机器人的测程。本教程是“机器人模拟”指南中的第二个教程。测量位移是仿真中的重要内容,设置测程的官方教程在此页面上,但我将逐步引导您完成整个过程。 您可以在此处获取此项目的完整代码。让我们开始吧! 二、ROS 2 中的里程…

dede编辑器修改成纯文本编辑器的方法

我在做优秀啦网站大全的时候需要的正文内容都不需要设置什么文字样式,所以我需要把编辑器上的工具全部取消掉,包括会员投稿中的编辑器工具栏全部取消掉或者屏蔽隐藏掉,所以我需要把DEDE编辑器修改成纯文本编辑器的方法如下:如图&a…

【Docker】Docker高级网络(NetWork)

【Docker】Docker高级网络(NetWork) 文章目录 【Docker】Docker高级网络(NetWork)1. 概述2. 网络2.1 网桥类型2.2 创建网络自定义桥2.3 查看所有网络2.4 查看特定网络的细节2.5 删除特定网络2.6 多个容器使用指定网络 参考文档:高级网络配置 Docker – 从入门到实践…

力扣小技巧:如何用最简单的方式实现小写字母转换

本篇博客会讲解力扣“709. 转换成小写字母”的解题思路,这是题目链接。 本题的解法非常简单,只需利用tolower函数即可。这个函数的作用是将所有大写字母转换为小写字母,而对其他字符不做任何改变。 char * toLowerCase(char * s){// 把字符串…

Spring接收前端传递数据的方式

搭建项目 然后点击下一步完成即可搭建成功 在pom文件中导入lombok的jar包,帮助我们快速创建实体类 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version> </dependency&…

外包软件定制开发中质量控制

引言 在外包软件定制开发项目中&#xff0c;确保交付的软件质量符合预期是至关重要的。由于外包团队通常是独立于企业的&#xff0c;他们可能没有对企业的业务需求和标准有深入的了解。因此&#xff0c;质量控制成为一个重要的挑战。本文将探讨外包软件定制开发中常见的质量控…

ubuntu安装单个redis服务

1.apt-get install redis-server 使用lighthouse用户这样操作会报与权限有关的错误&#xff0c; 改成使用root账号操作 2.安装完成后&#xff0c;Redis服务器会自动启动&#xff0c;查看进程是否正常启动 ps -axu|grep redis redis 18689 0.1 0.4 40136 6860 ? …

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine&#xff0c;RBM&#xff09;是一种基于能量模型的人工神经网络。它只有一个隐层&#xff0c;将输入层和隐层中的每个神经元互相连接&#xff0c;但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

解决win11系统下vivado使用RTL分析闪退、小蓝熊easy anti chat无法启动问题

最近在接触使用vivado时被这个软件庞大的包体和繁多的报错搞得焦头烂额&#xff0c;经过多次尝试&#xff0c;我解决了两个困扰我许久的关乎软件正常使用的问题&#xff0c;将解决办法分享给大家。 一.RTL analysis运行闪退 这个问题关系到程序的正常使用&#xff0c;主要发生…

9.带你入门matlab假设检验(matlab程序)

1.简述 函数 ztest 格式 h ztest(x,m,sigma) % x为正态总体的样本&#xff0c;m为均值μ0&#xff0c;sigma为标准差&#xff0c;显著性水平为0.05(默认值) h ztest(x,m,sigma,alpha) %显著性水平为alpha [h,sig,ci,zval] ztest(x,m,sigma,alpha,tail) %sig为观察…

Pytorch深度强化学习1-3:策略评估与贝尔曼期望方程详细推导

目录 0 专栏介绍1 从一个例子出发2 回报与奖赏3 策略评估函数4 贝尔曼期望方程5 收敛性证明 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;辅…

油猴脚本-Bilibili剧场模式仿Youtube

对比某个不存在的视频网站&#xff08;YouTube&#xff09;&#xff0c;以及B站的播放模式&#xff0c;普通模式以及网页全屏之间都有一个“中间档”&#xff0c;油管的叫 剧场模式&#xff0c;B站的叫 宽屏模式。 剧场模式 宽屏模式 相比之下&#xff0c;还是更喜欢油管的剧…

高并发的哲学原理(六)-- 拆分网络单点(下):SDN 如何替代百万人民币的负载均衡硬件

上一篇文章的末尾&#xff0c;我们利用负载均衡器打造了一个五万 QPS 的系统&#xff0c;本篇文章我们就来了解一下负载均衡技术的发展历程&#xff0c;并一起用 SDN&#xff08;软件定义网络&#xff09;技术打造出一个能够扛住 200Gbps 的负载均衡集群。 负载均衡发展史 F5 …

网络协议与攻击模拟-17-DNS协议-报文格式

二、DNS 查询 客户机想要访问www.baidu.com&#xff0c;根据自己的 TCP / IP 参数&#xff0c;向自己的首选 DNS 服务器发送 DNS 请求 首选 DNS 收到客户机的请求后&#xff0c;会去查询自己的区域文件&#xff0c;找不到www.baidu.com的 IP 地址信息&#xff08;将请求转发到…

【论文阅读】TransCAM: Transformer Attention-based CAM Refinement for WSSS

分享一篇阅读的用于弱监督分割的论文 论文标题&#xff1a; TransCAM: Transformer Attention-based CAM Refinement for Weakly Supervised Semantic Segmentation 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/liruiwen/TransCAM Abstract 大多数现有…