Nginx【反向代理负载均衡动静分离】--下

news2024/11/23 22:15:43

Nginx【反向代理负载均衡动静分离】–下

Nginx 工作机制&参数设置

master-worker 机制

示意图

在这里插入图片描述

图解

  1. 一个master 管理多个worker
    在这里插入图片描述

一说master-worker 机制

● 争抢机制示意图

在这里插入图片描述

图解

  1. 一个master Process 管理多个worker process, 也就是说Nginx 采用的是多进程结构, 而不是多线程结构.
  2. 当client 发出请求(任务)时,master Process 会通知管理的worker process
  3. worker process 开始争抢任务, 争抢到的worker process 会开启连接,完成任务
  4. 每个worker 都是一个独立的进程,每个进程里只有一个主线程
  5. Nginx 采用了IO 多路复用机制(需要在Linux 环境), 使用IO 多路复用机制, 是Nginx 在使用为数不多的worker process 就可以实现高并发的关键

二说master-worker 机制

示意图

在这里插入图片描述

对上图说明

● Master-Worker 模式

1、Nginx 在启动后,会有一个master 进程和多个相互独立的worker 进程。

2、Master 进程接收来自外界的信号,向各worker 进程发送信号,每个进程都有可能来处理这个连接。

3、Master 进程能监控Worker 进程的运行状态,当worker 进程退出后(异常情况下),会自动启动新的worker 进程。

● accept_mutex 解决"惊群现象"/理论

1、所有子进程都继承了父进程的sockfd,当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。

2、大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,会消耗系统资源。

3、Nginx 提供了一个accept_mutex ,这是一个加在accept 上的一把共享锁。即每个worker 进程在执行accept 之前都需要先获取锁,获取不到就放弃执行accept()。有了这把锁之后,同一时刻,就只会有一个进程去accpet(),就不会有惊群问题了。

4、当一个worker 进程在accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。

5、一个请求,完全由worker 进程来处理,而且只能在一个worker 进程中处理。

● 用多进程结构而不用多线程结构的好处/理论

1、节省锁带来的开销, 每个worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。

2、独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的worker 进程

● 实现高并发的秘密-IO 多路复用

1、对于Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?

2、采用了IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量级和高并发

3、nginx 是如何具体实现的呢,举例来说:每进来一个request,会有一个worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个request 才会接着往下走。由于web server 的工作性质决定了每个request 的大部份生命都是在网络传输中,实际上花费在server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在

小结

Nginx 的master-worker 工作机制的优势

1、支持nginx -s reload 热部署, 这个特征在前面我们使用过

2、对于每个worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多

3、每个worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式/IO 多路复用来处理请求, 即使是高并发请求也能应对.

4、采用独立的进程,互相之间不会影响,一个worker 进程退出后,其它worker 进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程

5、一个worker 分配一个CPU , 那么worker 的线程可以把一个cpu 的性能发挥到极致

参数设置

worker_processes

● 需要设置多少个worker

  • 每个worker 的线程可以把一个cpu 的性能发挥到极致。所以worker 数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu 频繁切换上下文带来的损耗。
  • 设置worker 数量, Nginx 默认没有开启利用多核cpu,可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu 的性能
#2 核cpu,开启2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;

#2 核cpu,开启4 个进程,
worker_processes 4;
worker_cpu_affinity 01 10 01 10;

#4 核cpu,开启2 个进程,0101 表示开启第一个和第三个内核,1010 表示开启第二个和第四个内核;
worker_processes 2;
worker_cpu_affinity 0101 1010;

#4 个cpu,开启4 个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

#8 核cpu,开启8 个进程
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_cpu_affinity 理解

在这里插入图片描述

配置实例

在这里插入图片描述

  1. 重新加载nginx/usr/local/nginx/sbin/nginx -s reload
  2. 查看nginx 的worker process 情况

在这里插入图片描述

worker_connection

  1. worker_connection 表示每个worker 进程所能建立连接的最大值,所以,一个nginx 能建立的最大连接数,应该是worker_connections * worker_processes

​ (1)默认:worker_connections: 1024

​ (2)调大:worker_connections: 60000,(调大到6 万连接)

​ (3)同时要根据系统的最大打开文件数来调整.

系统的最大打开文件数>= worker_connections*worker_process 根据系统的最大打开文件数来调整,worker_connections 进程连接数量要小于等于系统的最大打开文件数,worker_connections 进程连接数量真实数量=worker_connections * worker_process

查看系统的最大打开文件数
ulimit -a|grep "open files"
open files (-n) 		65535
  1. 根据最大连接数计算最大并发数:如果是支持http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP 作为反向代理来说, 最大并发数量应该是worker_connections *worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端
    服务的连接,会占用两个连接,

看一个示意图

在这里插入图片描述

配置Linux 最大打开文件数

  1. 使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
  2. 新装的linux 默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
  3. 使用ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效ulimit -n 65535,-S 指soft,-H 指hard)
  4. 有如下三种修改方式:
    1. 在/etc/rc.local 中增加一行ulimit -SHn 65535
    2. 在/etc/profile 中增加一行ulimit -SHn 65535
    3. 在/etc/security/limits.conf 最后增加如下两行记录
      1. *soft nofile 65535
      • *hard nofile 65535

在CentOS 中使用第1 种方式无效果,使用第3 种方式有效果,而在Debian 中使用第2 种有效果
5. 参考: https://blog.csdn.net/weixin_43055250/article/details/124980838

搭建高可用集群

Keepalived+Nginx 高可用集群(主从模式)

集群架构图

在这里插入图片描述

解读

1、准备两台nginx 服务器, 一台做主服务器, 一台做备份服务器

2、两台Nginx 服务器的IP 地址, 可以自己配置, 不一定和我的一样(具体可以使用ifconfig 命令)

3、安装keepalived , 保证主从之间的通讯

4、对外提供统一的访问IP(虚拟IP-VIP)

示意图

在这里插入图片描述

具体搭建步骤

搭建高可用集群基础环境

准备两台Linux 服务器192.168.198.130 和192.168.198.131

  1. 可以克隆来完成
  2. 也可以直接拷贝一份
    在这里插入图片描述

在两台Linux 服务器, 安装并配置好Nginx

  1. 安装配置Nginx 步骤前面讲过, 如果你克隆的Linux, 本身就有安装好了Nginx, 直接使用即可.
  2. 验证安装是否成功, 在windows 可以通过IP 访问到Nginx,
  3. 因为我们是拷贝了一份Linux , 而新的Linux 的Ip 已经变化了, 所以需要克隆的Linux的nginx.conf 文件中的IP 地址, 做相应的修改
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在两台Linux 服务器, 安装keepalived

  1. 下载keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html

在这里插入图片描述

  1. 上传到两台Linux /root 目录下

在这里插入图片描述

  1. mkdir /root/keepalived
  2. 解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
  3. cd /root/keepalived/keepalived-2.0.20
  4. ./configure --sysconf=/etc --prefix=/usr/local

说明: 将配置文件放在/etc 目录下, 安装路径在/usr/local

  1. make && make install

说明: 编译并安装
8) 如果成功, 就会安装好keepalived 【可以检查一下】

说明: keepalived 的配置目录在/etc/keepalived/keepalived.conf

keepalived 的启动指令在/usr/local/sbin/keepalived

  1. 提示: 两台Linux 都要安装keepalived

完成高可用集群配置

1 、将其中一台Linux( 比如192.168.198.130) 指定为Master : vi/etc/keepalived/keepalived.conf

在这里插入图片描述

在这里插入图片描述

2、将其中一台Linux( 比如192.168.198.131) 指定为Backup( 备份服务器) : vi/etc/keepalived/keepalived.conf

在这里插入图片描述

在这里插入图片描述

3、启动两台Linux 的keepalived 指令: /usr/local/sbin/keepalived

4、观察两台linux 的ens33 是否已经绑定192.168.198.18

在这里插入图片描述

在这里插入图片描述

注意事项和细节

1、keepalived 启动后无法ping 通VIP,提示ping: sendmsg: Operation not permittedhttps://blog.csdn.net/xjuniao/article/details/101793935

2、nginx+keepalived 配置说明和需要避开的坑https://blog.csdn.net/qq_42921396/article/details/123074780

测试

1、首先保证windows 可以连通192.168.198.18 这个虚拟IP
在这里插入图片描述

2、访问nginx 如图

在这里插入图片描述

说明:大家可以看到, 因为192.168.198.130 是Master 他的优先级高, 所以访问的就是192.168.198.130 的Nginx, 同时仍然是支持负载均衡的.

3、停止192.168.198.130 的keepalived 服务, 否则直接关闭192.168.198.130 主机, 再次访问http://192.168.198.18/search/cal.jsp , 这时虚拟IP 绑定发生漂移, 绑定到192.168.198.131 Backup 服务, 访问效果如图
这里直接关闭192.168.198.130 Master 的keepalived 来测试

在这里插入图片描述

在这里插入图片描述

自动检测Nginx 异常, 终止keepalived

实现步骤

1、编写shell 脚本: vi /etc/keepalived/ch_nginx.sh简单说明: 下面的脚本就是去统计ps -C nginx --no-header 的行数, 如果为0 , 说明nginx已经异常终止了, 就执行killall keepalived

#!/bin/bash
        num=`ps -C nginx --no-header | wc -l`
        if [ $num -eq 0 ];then
        killall keepalived
fi

修改ch_nginx.sh 权限

chmod 755 ch_nginx.sh

修改192.168.198.130 主Master 配置文件

指令: vi /etc/keepalived/keepalived.conf

在这里插入图片描述

4、重新启动192.168.198.130 Master 的keepalived , 这时因为Master 的优先级高,会争夺到VIP 优先绑定.

在这里插入图片描述

在这里插入图片描述

5、手动关闭192.168.198.130 Master 的Nginx

在这里插入图片描述

注意观察keepalived 也终止了

在这里插入图片描述

6、再次访问nginx , 发现192.168.198.18 这个虚拟IP 又和192.168.198.131 备份服务器绑定了.

在这里插入图片描述

注意事项

keepalived vrrp_script 脚本不执行解决办法

-打开日志观察

tail -f /var/log/messages

-重启keepalived

systemctl restart keepalived.service

–说明一下,曾经出现过文件找不到可以修改执行脚本文件名,不要有_就OK

  1. 如果配置有定时检查Nginx 异常的脚本, 需要先启动nginx ,在启动keepalived ,否则keepalived 一起动就被killall 了
  2. 提醒: 小伙伴们配置时,会遇到各种各样问题,有针对性解决即可

配置文件keepalived.conf 详解

#这里只注释要修改的地方
global_defs {
    notification_email {
    	test@foxmail.com  #接收通知的邮件地址
        }
        notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱

        smtp_server 192.168.200.1 #smtp server 地址
        smtp_connect_timeout 30

        router_id Node132 #Node132 为主机标识
       vrrp_skip_check_adv_addr

        #vrrp_strict 	#这里需要注释,避免虚拟ip 无法ping 通
        
        vrrp_garp_interval 0
        vrrp_gna_interval 0
    }
    vrrp_instance VI_1 {
    
        state MASTER #主节点MASTER 备用节点为BACKUP
        
        interface ens33 #网卡名称
        
        virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一VRRP 组
        
        priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
        

         advert_int 1 #组播信息发送间隔,两个节点设置必须一样

            authentication { #设置验证信息,两个节点必须一致
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样

                192.168.200.16
            }
}

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

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

相关文章

字节8年经验总结:13 条自动化测试框架设计原则(建议收藏)

1.代码规范 测试框架随着业务推进,必然会涉及代码的二次开发,所以代码编写应符合通用规范,代码命名符合业界标准,并且代码层次清晰。特别在大型项目、多人协作型项目中,如果代码没有良好的规范,那么整个框…

leetcode109. 有序链表转换二叉搜索树(java)

有序链表转换二叉平衡搜索树 leetcode109. 有序链表转换二叉搜索树题目描述 解题思路代码演示链表和二叉树专题 leetcode109. 有序链表转换二叉搜索树 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/convert-sorted-lis…

QCameraViewfinder的使用

目录 引言核心代码完整代码 引言 本文是简单使用Qt快速使用摄像头完成截图等工作,主要涉及QCamera、QCameraViewfinder、QCameraImageCapture这三个类。QCamera通过相机的信息创建,用于控制开始接收图形、停止接收图像。QCameraViewfinder则是图像的展示…

(1Gbit)MT28EW01GABA1LPC-0SIT、MT28EW01GABA1HPC-0SIT FLASH - NOR 存储器

MT28EW01GABA1LPC-0SIT、MT28EW01GABA1HPC-0SIT 1Gbit并行NOR闪存器件具有较高的密度、就地执行 (XiP) 性能和架构灵活性,可满足汽车、消费类和移动产品的设计要求。该器件非常适合用于GPS/导航、汽车后视摄像头、手机、智能手机和电子阅读器。该器件还具有较宽的温…

【小沐学Python】Python实现turtle绘画

文章目录 1、简介2、接口说明2.1 海龟动作2.1.1 移动和绘制2.1.2 获取海龟的状态 2.2 画笔控制2.2.1 绘图状态2.2.2 颜色控制2.2.3 填充2.2.4 更多绘图控制 2.3 TurtleScreen/Screen 方法2.3.1 窗口控制2.3.2 使用屏幕事件2.3.3 Screen 专有方法 3、示例测试3.1 Turtle star3.2…

关于proxy的较深入研究

关于proxy的较深入研究 proxy是什么控制台打印proxy,展示一下vue3中的prxoy和es6的proxy有何不同?proxy对js和vue3来说有什么含义?proxy的封装机制 proxy是什么 Proxy是ES6中新增的一个对象,它可以用来代理另一个对象&#xff0c…

微服务eureka和nacos

服务远程调用 /*** 创建RestTemplate并注入Spring容器* return*/Beanpublic RestTemplate restTemplate(){return new RestTemplate();} Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.fin…

关于调试别人的bug中发现的细节问题1:Switch...case...分支,永远只选择第一个分支

1、Switch…case…分支,永远只选择第一个分支: 原因:switch()里面的不是传入的变量,m_curWindowType是个成员变量,一直是初始值。他喵的,不知道谁写的下面的代码,大晚上的我也没有细看&#xff…

13.3寸_Wifi标签功耗电流计算-单面屏幕-1.8V的Flash测试

13.3寸Wifi标签不工作的时候电流的消耗主要来自两部分: 待机时,醒来监听时。经过测量,13.3寸Wifi标签的待机电流是7.13uA , 醒来监听的峰值电流是51.6 mA。13.3寸Wifi标签系统设定每间隔1秒醒来一次监听是否有唤醒数据。充电锂电池电池的容量…

00后跳槽到我们公司拿了25K,“躺平”两个字骗了我好久···

都说00后已经躺平了,但是有一说一,该卷的还是卷。前段时间我们部门就来了个00后,工作都还没两年,跳到我们公司起薪25K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。最近和他…

【配置环境】Windows下C/C++第三方库管理工具vcpkg安装和使用

一,vcpkg简介 vcpkg是微软公司开发的一个开源C包管理工具,它可以很方便的帮助您在 Windows、 Linux 和 MacOS 上下载,编译和安装C 第三方库。它具有自动解决依赖关系的能力,并且支持多种目标架构和平台。提供了超过1500个C库的预…

架构师基础篇之如何画架构图C4模型

1. 前言 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型,并手把手教大家如何使用代码绘制出精美的C4架构图。 阅读本文之后,读者画的架构图将会是这样的: 注:该图例仅作绘图示例使用,不确保其完整性、可…

❤ 关于以太网没有有效的ip配置问题解决方法

❤ 关于以太网没有有效的ip配置问题解决方法 错误提示 解决方法 一,检查IP地址是否为自动获取 1,首先右键任务栏右下角的网络图标点击进入"网络和共享中心",然后点击"更改适配器设置"。 2,在适配器界面右键"本…

异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测

文章目录 文章概述模型描述源码分享学习小结文章概述 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测 模型描述 IsolationFores算法它是一种集成算法(类似于随机森林)主要用于挖掘异常(Anomaly)数据,或者说离群点挖掘,总之是在一大堆数据中,找出与其它数据…

***杨辉三角_yyds_LeetCode_python***

1.题目描述: 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows …

第3章“程序的机器级表示”:异类的数据结构

文章目录 概述3.9.1 结构3.9.2 联合 概述 C提供了两种将不同类型的对象结合到一起来创建数据类型的机制:结构(structure),用关键字 struct 来声明,将多个对象集合到一个单位中;联合(union&…

Java网络开发(Asynchronous)—— 从 Jsp 到 Ajax 的 axios 到 vue 同步请求 到 异步请求

目录 引出如果想做bilibili边看视频边评论怎么搞?Ajax是啥?& axios的语法1. Ajax(Asynchronous JavaScript And XML)简介2. axios语法 及其与 java后端交互(1)get请求(2)post请求…

SpringBoot之Spring Data JPA入门学习

JPA&#xff08;Java Persistence API&#xff09;Java持久化API&#xff0c;是 Java 持久化的标准规范&#xff0c;Hibernate是持久化规范的技术实现&#xff0c;而Spring Data JPA是在 Hibernate 基础上封装的一款框架。 一、添加依赖 <dependency><groupId>or…

【git指南--命令大全】

我看好多文章命令都记录得比较发散不够全面&#xff0c;这里还是把我自己的笔记分享出来&#xff0c;方便查阅。 文章目录 1. git config作用域--list 显示当前所有配置配置cd ~/.ssh 2. 初始化 git 仓库1、把已有项目代码纳入 git 管理2、新建的项目直接用git 管理3、克隆仓库…

智能指针 smart_ptr

智能指针 为什么需要智能指针&#xff1f;内存泄漏什么是内存泄漏&#xff0c;内存泄漏的危害内存泄漏分类 智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr 为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内…