深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」

news2024/11/24 14:30:39

负载均衡

之前的章节内容中【深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」】和 【深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」】,我们采用的代理仅仅指向一个服务器。但是网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。Nginx也可以实现简单的负载均衡功能。

Nginx作为HTTP负载均衡器

Nginx是以高并发和内存占用少出名,它是一个http服务器,也是反向代理服务器,它更是负载均衡器。作为负载均衡器,在版本1.9之前,它只能作为http的负载均衡,也就是在网络模型的第七层发挥作用,1.9之后,它可以对tcp进行负载均衡,比如redis,mysql等。

负载均衡跨越多个应用程序实例,在多个应用实例间做负载均衡是一个被广泛使用的技术,其用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。可以使用Nginx作为高效的HTTP负载均衡器,将流量分布到多个应用服务器,并通过Nginx 提高 web 应用程序的性能、可扩展性和可靠性。

Nginx的负载均衡方法

Nginx 提供了多种负载均衡策略,常用的支持以下负载均衡机制:

  • 轮询(round-robin) - 发送给应用服务器的请求以轮询的方式分发
  • 加权轮询(weight-round-robin)
  • 最少连接(least-connected) - 下一个请求被分配给具有最少数量活动连接的服务器
  • 加权最少连接(weight-least-connected)
  • ip 哈希(ip-hash) - 使用哈希函数确定下一个请求应该选择哪一个服务器(基于客户端的 IP 地址)
  • 普通 Hash(url-hash)- request_uri,一个简单的负载均衡的示例,把url均衡到不同的服务器,也可以改为均衡到不同的地址上。

Nginx的负载均衡语法

upstream指令

upstream指令用于定义服务器集群。服务器可以监听在不同端口。另外,监听在TCP和UNIX-domain socket的服务器可以混合使用。默认,使用带权重的round-robin平衡算法将请求分派到服务器。

http {
     upstream [你的负载均衡机制名称,随便设置一个就好] {
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
 }
 server {
	 listen [nginx监听端口];
	 server_name [head中的host对应的值]
	 location / {
	   proxy_pass http:// [你的负载均衡机制名称,对应上面upstream的值];
         }
    }
}

默认负载均衡配置

使用Nginx进行负载均衡的最简单配置如下所示:

在上述案例中,在 【www.address1.com】、【www.address2.com】、【www.address3.com】,我们需要启动暴漏运行相同的应用的三个实例。当负载均衡方法没有被特别配置时,默认采用轮询(round-robin)。所有请求都被代理到服务器组loadBalanceServer,Nginx应用 HTTP 负载均衡来分发请求。

http {
    upstream loadBalanceServer {
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

Nginx中的反向代理实现包括 HTTP、HTTPS、FastCGI、uwsgi、SCGI 和 memcached。要配置 HTTPS 而不是 HTTP 负载均衡,只需要使用 HTTPS 协议。在为 FastCGI、uwsgi、SCGI 或 memcached 设置负载均衡时,分别使用 fastcgi_pass、uwsgi_pass、scgi_pass 和 memcached_pass 指令。

最少连接负载均衡

  • 负载均衡的规则是最少连接。在一些请求需要更长的时间才能完成的情况下,最少连接可以更公正地控制应用程序实例的负载。使用最少连接的负载均衡,nginx 将尽量不给过于繁忙的应用服务器负载过多的请求,而是将新的请求分发到不太忙的服务器。
  • 当使用 least_conn 指令作为服务组配置的一部分时,将激活 nginx 中的最少连接负载均衡:
http {
    upstream leastConnLoadBalanceServer {
        least_conn;
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

IP哈希负载均衡

配置 IP 哈希负载均衡,只需要将 ip_hash 指令添加到服务器 upstream 组配置中即可:

http {
upstream ipHashLoadBalanceServer {
        ip_hash;
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

普通 Hash

主要根据url进行hash计算处理操作,没啥可讲解的

http {
	upstream ipHashLoadBalanceServer {
 	    hash $request_uri;
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

加权负载均衡

可以通过使用服务器权重进一步加强Nginx的负载均衡算法。

  • 在上面的示例中,服务器权重没有被配置,这意味对于特定的负载均衡方法来说所有指定的服务器都具有同等资格。

  • 特别是使用轮询方式,这也意味着服务器上的请求分配或多或少都是相等的 —— 只要有足够的请求,并且以统一的方式足够快速地完成请求处理。

  • 当服务器指定 weight 参数时,权重将作为负载均衡决策的一部分进行核算, weigth参数表示权值,权值越高被分配到的几率越大,默认情况下(轮询)所有服务器权重为 1。

 http {
	upstream ipHashLoadBalanceServer {
        ip_hash;
        server www.address1.com weight=3;// 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com; // default weight=1
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

在 nginx 的最近版本中,可以在最少连接和 IP 哈希负载均衡中使用权重。

最少连接负载均衡(加权)

http {
    upstream leastConnLoadBalanceServer {
        least_conn;
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com weight=3;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

会话持久化

  • 使用轮询或者最少连接的负载均衡,每个后续客户端的请求都可能被分配到不同的服务器。不能保证同一个客户端始终指向同一个服务器。

  • 如果需要将客户端绑定到特定的应用服务器,换而言之,使客户端会话「粘滞」或者「永久」,始终尝试选择特定的服务器,IP 哈希负载均衡机制可以做到这点。

  • 使用 IP 哈希,客户端的 IP 地址用作为哈希键,以确定应用为客户端请求选择服务器组中的哪个服务器。此方法确保了来自同一个客户端的请求始终被定向到同一台服务器,除非该服务器不可用。

Nginx健康检查

  • Nginx中的反向代理实现包括了带内(或者被动)服务器健康检查。如果特定服务器的响应失败并出现错误,则 nginx 会将此服务器标记为失败,并尝试避免为此后续请求选择此服务器而浪费一段时间。

  • max_fails 用于设置在 fail_timeout 期间与服务器通信失败重新尝试的次数。默认情况下,max_fails 设置为 1。当设置为 0 时,该服务器的健康检查将被禁用。fail_timeout 参数还定义了服务器被标记为失败的时间。在服务器发生故障后的 fail_timeout 间隔后,nginx 开始以实时客户端的请求优雅地探测服务器。如果探测成功,则将服务器标记为活动。

故障下线和备份服务设置

down

假如有一台主机是出了故障,或者下线了,要暂时移出,那可以把它标为down,表示请求是会略过这台主机的。

upstream downServer {
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com down;
}

backup

backup是指备份的机器,相对于备份的机器来说,其他的机器就相当于主要服务器,只要当主要服务器不可用的时候,才会用到备用服务器。

upstream backupServer {
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com backup;
}

max_fails和fail_timeout

默认情况下,max_fails的值为1,表示的是请求失败的次数,请求1次失败就换到下台主机。另外还有一个参数是fail_timeout,表示的是请求失败的超时时间,在设定的时间内没有成功,那作为失败处理。

upstream backupServer {
        server www.address1.com max_fails=2; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com backup;
}

那什么情况才叫请求失败呢?有可能是服务器内部错误,超时,无效的头部,或返回500以上的状态码的时候。

Nginx实际案例配置

nginx.conf 配置如下:

http {
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;
    #设定负载均衡的服务器列表
    upstream load_balance_server {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }
   #HTTP服务器
   server {
        #侦听80端口
        listen       80;
        #定义使用www.xx.com访问
        server_name  www.helloworld.com;
        #对所有请求进行负载均衡请求
        location / {
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表
            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

里面没有介绍的不用担心,后面我会专门讲解介绍和说明对应的参数,大多数都属于优化和传输方面的参数1

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

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

相关文章

【万兴PDF专家】OCR引擎的离线安装方法,让你不受网速的折磨,PDF给OCR成可搜索的高级PDF,牛逼了我的万兴

一、问题背景 万兴PDF是一个很好用的PDF工具,它不仅可以实现PDF的浏览和批注常见功能,还具有OCR、压缩PDF,乃至批量化的功能。 因此,实在是一个非常值得花钱去买的PDF工具包!! 但是,软件里的O…

Prometheus与Grafana监控SpringBoot应用

Prometheus与Grafana监控SpringBoot应用 1.SpringBoot应用暴露端点 2.转换成Prometheus能解析得数据 3.向Prometheus注册时赋予项目名 docker部署 4701模板

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例 文章目录七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例0.总体功能概述1.TIM硬件介绍1.1 TIM1/3级联硬件介绍1.1.1 主从模式介绍1.1.2 TIM1为主,TIM3为从,TIM3 的输入触发源选…

【计算机网络】习题(三)—— 数据链路层

【计算机网络】习题(三)—— 数据链路层2.数据链路层协议的功能不包括(). A.定义数据格式 B。提供结点之间的可靠传输 C.控制对物理传输介质的访问 D.为终端结点隐蔽物理传输的细节 2.D 主是是数据链路层的主要功能包…

SECCON CTF 2022 web复现

skipinx 知识点:qs 参数解析错误qs简介 一句话介绍就是:qs是负责url参数转化的js库,当然也可以说是查询字符串解析和字符串化库。 详细了解移步:https://www.npmjs.com/package/qs qs简单用法 例如:我们 url 参数…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议,V4版本相交V3版本,修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型,这样使得NTP能够更好的支持1ns的场景,轮询间隔也从上一代的最多1024s拓展到了36…

上位机通信标准-OPC

OPC通信,基于OPC的通信是一种通信整合方案,通过OPC标准,整合各类协议并统一化接口。 1、上位机通信环境 - 品牌、各类繁多 - 通信环境的统一:OPC 2、OPC - 什么是OPC:OLE for Process Control Windows插件&#x…

数字集成电路设计(五、仿真验证与 Testbench 编写)(一)

文章目录引言1. Verilog HDL 电路仿真和验证概述2. Verilog HDL测试程序设计基础2.1 Testbench及其结构2.2 测试平台举例2.2.1 组合电路仿真环境搭建2.2.2 时序电路仿真环境搭建2.3 Verilog HDL仿真结果确认2.4 Verilog HDL仿真效率3. 与仿真相关的系统任务3.1 $display和\$wri…

Mybatis的二级缓存 (默认方式)

目录前置生效场景一场景二失效场景一场景二场景三场景四脏数据场景前置 什么是二级缓存: 一级缓存是基于sqlsession级别, 当一个sqlsession会话结束, 一级缓存也就结束了. 定义一级缓存为局部缓存, 那么二级缓存就是全局全局缓存 二级缓存是基于mapper文件的namespace级别&…

进程和线程的区别

进程和线程的区别 文章目录进程和线程的区别进程和线程的概念一、从属关系不同二、所属基本单位不同三、资源消耗不同四、是否同步和互斥额外补充问题:一个进程是不是可以创建无限数量的线程?参考链接进程和线程的概念 在了解区别之前,我们先…

【Java】IO流 - 字节流

文章目录FileInputStream 介绍FileOutputStream介绍文件输入输出综合使用【拷贝】FileInputStream 介绍 创建一个txt文件,写入 HelloWorld 并用Java读取: Test public void readFile01(){//提前创建一个文件hello.txt并编辑一个HelloWorldString filePa…

Nacos 注册中心的常用配置

1.服务端地址 spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的 ip 地址和端口2.服务名 spring.cloud.nacos.discovery.s ervice ${spring.application.name} 给当前的服务命名3.服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP 设置服务所处的…

机器视觉之ros人脸识别

系列文章目录 机器视觉之ros人脸识别 ros人脸识别系列文章目录一、WIN下的环境设置二、连接摄像头设备到虚拟机三、安装摄像头驱动设备3.1判断安装usb还是uvc驱动包3.2查看摄像头设备3.3测试网络摄像头3.4安装摄像头驱动包四、调用视觉功能包五、人脸识别的调用一、WIN下的环境…

封装系统之新手操作版

一、需要软件:Vmware16,win10正版系统,EasySysprep5,EasyU_v3.6.iso 下载地址:EasySysprep5:https://www.itsk.com/thread-425990-1-1.html EasyU_v3.6:https://www.itsk.com/thread-426856-1-1…

【计算机视觉】不来试试图片轮廓提取?

文章目录🚩 前言🍈 边缘提取原理卷积用特殊的卷积核进行轮廓提取🍏 开始轮廓提取代码🚩 前言 最近学到了深度学习的卷积操作,在卷积神经网络出现之前,就已经有使用卷积核 (也叫滤波器&#xff…

NLP模型(三)——FastText介绍

文章目录1. FastText 概述2. FastText 分类模型2.1 结构2.2 n-gram3. FastText 词嵌入模型1. FastText 概述 首先,我们得搞清楚,FastText 是什么?有的地方说是分类模型,有的地方又将其用于词向量,那么,Fas…

ppt复现CVPR顶会流程图

本次目标如下图,难点在于立方体和矩阵格网的绘制 文末附机器学习绘图模板~ 先来绘制立方体,插入——形状——立方体,调节成如下图,再点击水平翻转: 绘制矩形,多绘制几个组合成矩形格网,右键设置…

TFT-LCD屏幕读取Flash芯片图片资源并显示

TFT-LCD屏幕读取Flash芯片图片资源并显示 在前面用TFT-LCD显示图片的实验中,由于图片资源过大,240 * 320 的图片大小为150K,而STM32F103ZET6的内部Flash才512K,最多能放三张图片,所以这次将图片放到外部Flash中&#…

【Java八股文总结】之Redis数据库

文章目录Redis 数据库一、Redis基础1、Redis应用场景2、Redis数据类型3、Redis常用命令4、Redis为什么速度快?5、Redis和Memcached的区别和共同点6、Redis和MySQL的区别?二、高可用1、主从复制Q:主从复制主要的作用?2、Redis主从复制原理Red…

Cadence之Allegro:蛇形与差分等长

文章目录 一、三种等长方法二、直接等长法设置教程1、差分设置2、analysis设置三、pin-pair法设置教程一、三种等长方法 直接等长法 适用pin和pin之间没有容抗和阻抗的情况,即pin和pin之间只有一根线、没有电阻和电容的时候才可以使用这种方法。 pin-pair法 建立Sigxplorer模形…