当前位置: 首页 > news >正文

Nginx实现负载均衡

Nginx实现负载均衡
负载均衡的作用

1、解决单点故障,让web服务器构成一个集群

2、将请求平均下发给后端的web服务器

负载均衡的软硬件介绍

负载均衡软件:

# nginx
四层负载均衡:stream(nginx 1.9版本以后有stream模块,才可以做四层负载)
七层负载均衡:upstream模块# HAproxy
四层负载均衡
四层负载均衡# LVS
只能做四层负载:不识别域名,只识别端口。也就是只能做端口转发、端口代理。但同样四层,LVS的速度是最快的。why?LVS,它是直接把你物理服务器变成硬件的负载均衡。用命令 ipvsadm修改网络和路由配置,直接这台机器变负载均衡。请求到达服务器就直接向后转发了,无需经过像nginx这些应用###软件如何选?
中小型:nginx
大型互联网公司:前端LVS做四层转发,后端nginx做七层转发

负载均衡硬件:

F5、Netscaler等。淘宝、赶集网、新浪等公司使用过 Netscaler 负载均衡产品。

###硬件如何选型?

当企业业务重要、技术力量又薄弱,并且希望出钱购买产品及获取更好的服务时,可以选择硬件负载均衡产品,如 F5、Netscaler等,此类公司多为传统的大型非互联网企业,如银行、证券、金融、宝马、奔驰等。

对于门户网站来说,大多会并用软件及硬件产品来分担单一产品的风险,如淘宝、腾讯、新浪等。融资企业可能会购买硬件产品,如赶集等网站。

中小型互联网企业由于起步阶段无利润或者利润很低,会希望通过使用开源免费的方案来解决问题,因此会雇用专门的运维人员进行维护。

相比较而言,商业的负载均衡产品成本高、性能好,更稳定,缺点是不能二次开发,开源的负载均衡软件对运维人员的能力要求较高,如果运维及开发能力强,那么开源软件的负载均衡是不错的选择,目前的互联网行业更偏向使用开源的负载均衡软件
云服务的负载均衡:

阿里云:SLB

亚马逊上被称作ELB

各种叫法不同,作用都是一样的

七层和四层的区别
四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发。由此可以看出,七层负载均衡效率没有四负载均衡高。

但七层负载均衡更贴近于服务,如http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。

四层,走四层 传输层

七层,走七层 应用层

区别:四层较快,但无法识别域名,七层可以识别域名

nginx实现简单负载均衡

简单架构图:
在这里插入图片描述
环境准备

在这里插入图片描述

简单web站点准备# web01 web02
gzip -r /etc/nginx/conf.d/* (可以把conf.d目录下之前的配置都打包备份)
cd /etc/nginx/conf.d
vim lb.xxx.confserver{listen 9999;  #开放9999端口server_name lb.xxx.com;root /code/lb;index index.html;
}# 创建站点目录
mkdir -p /code/lb# 创建index.html
echo 'web01' > /code/lb/index.html   //web01的配置
echo 'web02' > /code/lb/index.html   //web02的配置# 检测语法并重启
nginx -t
systemctl reload nginx# 检查端口
[root@web01 /code/lb]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      10916/php-fpm: mast
tcp        0      0 0.0.0.0:9999            0.0.0.0:*               LISTEN      15540/nginx: master
...# 本地域名解析
#10.0.0.5 lb.xxx.com
10.0.0.7 lb.xxx.com
#10.0.0.8 lb.xxx.com# 分别访问web01和web02

在这里插入图片描述
在这里插入图片描述

负载均衡配置(lb01)# lb01
[root@lb01 ~]# cd /etc/nginx/conf.d
[root@lb01 /etc/nginx/conf.d]# vim lb.conf
upstream www_pools{      #//自定义服务器池名www_pools,这里包括web01和web02两个web节点server 172.16.1.7:9999;server 172.16.1.8:9999;
}
server {       #//定义代理的负载均衡域名虚拟主机  listen 80;server_name lb.xxx.com;location / {proxy_pass http://www_pools;    #//访问lb.xxx.com,请求发给www_pools里面的节点include /etc/nginx/conf.d/proxy_params;   #//反向代理参数}
}[root@lb01 /etc/nginx/conf.d]# cat proxy_params
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;# 检查语法,重载nginx
nginx -t
nginx -s reload# 本地域名解析
10.0.0.5 lb.xxx.com
#10.0.0.7 lb.xxx.com  
#10.0.0.8 lb.xxx.com  # 访问。此时刷新浏览器,一次访问web01,下一次访问web02

在这里插入图片描述

负载均衡核心组件Upstream模块Nginx实现负载均衡的组件主要有两个。一个是proxy模块,还有一个是upstream模块ngx_http_upstream_module,这是nginx实现负载均衡的核心组件。它支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等,新版Nginx支持的方式有所增加。我们主要针对proxy_pass代理方式讲解。ngx_http_upstream_module模块允许Nginx定义一组或多组web节点(服务器节点),使用时可以通过proxy_pass把网站的请求发送到事先定义好的upstream组上。具体写法为:proxy_pass http://abc 。其中abc就是一个upstream组名。 注意upstream 仅仅是定义服务器池,并不会直接处理用户的请求,必须要有其他方式将请求转给这个服务器池(比如proxy_pass)才行。upstream模块的内容应放于http{}层,即与server层平齐。其默认调度算法为wrr(weight默认为1,即rr)官方网站:https://nginx.org/en/docs/http/ngx_http_upstream_module.htmlUpstream模块语法# 基本配置示例
upstream www_pools{      #//upstream为关键字,必须要有,www_pools为自定义组名server 172.16.1.7:9999  weight=5;    server 172.16.1.8:9999  weight=10;server 172.16.1.9:9999  weight=15; #//server为固定关键字,后面可以接域名或IP。如不指定端口,默认80
}# 较完整的upstream配置示例
upstream backend {                                  
server 10.0.0.7;   #//此标签等价于下面标签,多出来的是默认值,可以不写
server 10.0.0.8:80 weight=1 max_fails=2 fail_timeout=10s;
}参数解释:
weight         #weight代表服务器权重,数值越大被分配的请求越多。默认值为1
max_fails      #Nginx尝试连接后端主机失败的次数,默认1,京东1,建议2-3次
fail_timeout   #在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s,常规业务建议2-3s(比如京东是3s)
down           该服务器不可用。配合ip_hash使用比如 max_fails=2 fail_timeout=10s 意思是2次连续检测失败后,间隔10s在重新检测。# 使用域名及socket的示例
upstream backend {                                      server backend1.example.com weight=5;server backend2.example.com:8080;           #//域名+端口。server unix:/tmp/backend3;                  #//指定socket文件server backup1.example.com:8080   backup;   #//backup表示备份服务器(备节点),其他服务器都不可访问时启用。server backup2.example.com:8080   backup;
}ps: server后面如果接域名,需要内网有DNS服务器或者在负载均衡的hosts文件做域名解析。Upstream模块调度算法调度算法一般分为以下两类:—类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器情況。例如rr、wrr、ip_ hash都属于静态调度算法。第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求。例如:连接数少的优先获得请求,响应时间短的优先获得请求。least_conn 、fair等属于动态调度算法。

Upstream模块调度算法

调度算法一般分为以下两类:—类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器情況。例如rr、wrr、ip_ hash都属于静态调度算法。第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求。例如:连接数少的优先获得请求,响应时间短的优先获得请求。least_conn 、fair等属于动态调度算法。

1、rr轮询(Round Robin,默认调度算法,静态调度算法)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除;
2、wrr轮询(weight Round Robin,权重轮询,静态调度算法)在轮询算法的基础上加上权重weight,权重轮询和访问成正比,权重值越大,转发的请求也就越多;
3、ip_hash(静态调度算法)每个请求按访问的IP的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法希出一个值,在随后请求中客户端ip的哈希值只要相同,就会被分值至同一台服务器,该调度算法可以解决网页session共享问题,但有时会导致请求分配不均和无法保证相对的负载均衡;注意:当调度算法是ip_hash 时,后端服务器中负载均衡调度中的状态不能有weight和backup,即使有也不会生效。
4、fair(动态调度算法)按照后端服务器节点的响应时间来智能分配请求,响应时间短的优先分配,这中调度算法是更加智能的算法,这种算法可以依据页面大小和加载时间长短智能的进行负载均衡,nginx本身不支持fair,需要下载nginx的upstream_fair模块;
5、least_conn(动态调度算法)根据后端节点的连接数来决定分配情况,哪个后端节点连接数少就连接哪个;
6、url_hash与ip_hash调度算法类似,但url_hash是按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,这当后端服务器是缓存服务器时效果更显著;

加权轮询的例子

[root@lb01 /etc/nginx/conf.d]# cat lb.xxx.conf
upstream lb.xxx.com{
server 172.16.1.7:9999 weight=3;  #//实测这样配置是先一次web01,再两次web02(1:2)
server 172.16.1.8:9999 weight=6;
}
server {
listen 80;
server_name lb.xxx.com;location / {
proxy_pass http://lb.xxx.com;
include /etc/nginx/conf.d/proxy_params;
}
}

ip_hash的例子

upstream lb.xxx.com{ip_hash;    #//加一下即可。这时它就一直访问web01。如果.8在上面就一直访问web02server 172.16.1.7:9999;server 172.16.1.8:9999;server 172.16.1.9:9999;
}
server {listen 80;server_name lb.xxx.com;location / {proxy_pass http://lb.xxx.com;include /etc/nginx/conf.d/proxy_params;}
}

注意用ip_hash时不要再写入weight和backup两个参数,即使写了也不会生效

相关文章:

Nginx实现负载均衡

Nginx实现负载均衡 负载均衡的作用 1、解决单点故障,让web服务器构成一个集群 2、将请求平均下发给后端的web服务器 负载均衡的软硬件介绍 负载均衡软件: # nginx 四层负载均衡:stream(nginx 1.9版本以后有stream模块&#x…...

SpringCloud 2022有哪些变化

目录 前提条件 AOT支持 Spring Native支持 前提条件 Spring Cloud 2022.0.0是构建在Spring Framework 6.0和Spring Boot 3.0 之上的一S个主要版本。 JDK要求最低需要是Java 17J2EE要求最低需要Jakarta EE 9 AOT支持 Spring cloud 2022支持AOT编译,它是将程序源…...

如何快速本地搭建悟空CRM结合内网穿透工具高效远程办公

🌈个人主页:聆风吟 🔥系列专栏:数据结构、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 无需公网IP,使用cpolar实现悟空CRM远程访问二. 通过公网来访问公司…...

Docker打包Python项目

1. 简介 Docker是一种开源的容器化平台,可以将应用程序及其依赖项打包到一个轻量级、可移植的容器中。通过使用Docker,可以简化Python项目的部署和运行,提高开发效率和应用程序的可移植性。 本文将介绍如何使用Docker来打包Python项目。我们…...

【Java并发编程一】并发与并行

为什么引入并发 摩尔定理逐渐失效,单核性能很难提升,通过组合多核性能来进一步满足实际需要,从而引入并发编程。在大部分场景下,并行是由于串行的,并行可以优化非关键节点的时间消耗。 并发的三大特性 原子性  某个…...

MFC/QT 一些快忘记的细节:

1:企业应用中,MFC平台除了用常见的对话框模式还有一种常用的就是单文档模式, 维护别人的代码,不容易区分,看它与程预序认同名cpp,就知道了,比如项目名称为 DoCMFCDemo,那么就看BOOL CDocMFCDe…...

在服务器上部署MVC 6应用程序

在服务器上成功部署MVC 6应用程序(现在更为称为ASP.NET Core MVC)涉及一系列步骤。以下是一般的指导步骤: 1. 准备服务器环境: - 确保服务器上安装了.NET Core Runtime和.NET Core SDK。可以从[.NET下载页面](https://dotnet.mi…...

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表,其中每个数字是前两个斐波那契数字之和。 例如,数字 6 的序列是 1,1,2,3,5,8,数字 7 的序列是 1,1,2,3,5,8,13,数字 8 的序列是 1,1,2,3,5…...

学习raft协议(1)

CAP C: 一致性 强调数据的正确性,每次读操作,要么读到最新,要么读失败 A:可用性 不发生错误,也不能出现过长的等待时间. P:分区容错性 在网络环境不可靠的背景下,整个系统仍然是正常运作的两种流派 (1&am…...

SpringSecurity+jwt使用

参考文章链接 自定义SpringSecurity用户 package com.daben.springsecurityjwt.vo;import com.daben.springsecurityjwt.entity.SysUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; import j…...

html-网站菜单-点击显示导航栏

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…...

【C++函数的进化】函数指针,模板,仿函数,lambda表达式

/*** poject * author jUicE_g2R(qq:3406291309)* file C函数的进化* * language C* EDA Base on VS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT 原创学习笔记&#xff1a;转载需获得博…...

云服务器windows service2022 部署git服务器

1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 进入c:\gitblit\data 目录里面找到,defaults.properties 文件,编辑主…...

Linux_Docker修改Docker Root Dir

今天遇到需求&#xff0c;要修改一下docker容器和镜像的存储位置&#xff0c;默认位置为/var/lib/docker目录下&#xff0c;要修改到/new/dockerFile目录下。 停止docker服务 sudo service docker stop 备份docker容器镜像 移动/var/lib/docker目录下的文件到/dockerFile目录…...

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时&#xff0c;我进行HTTP post传输报告负载时&#xff0c;由于SSL验证设置为True&#xff0c;请求失败&#xff0c;错误如下&#xff1a;(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…...

【开源】基于Vue.js的开放实验室管理系统的设计和实现

项目编号&#xff1a; S 013 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S013&#xff0c;文末获取源码。} 项目编号&#xff1a;S013&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…...

使用composer安装ffmpeg的步骤

以下是使用composer安装ffmpeg的步骤&#xff1a; 1.在laravel根目录下执行以下命令安装ffmpeg&#xff1a; composer require php-ffmpeg/php-ffmpeg 2.如果不指定版本号&#xff0c;则默认使用0.14版本。 3.执行以上命令后&#xff0c;composer会自动下载并安装ffmpeg。 …...

RT-DETR优化策略:轻量级Backbone改进 | 高效模型 (Efficient MOdel, EMO),现代倒残差移动模块设计|ICCV2023

🚀🚀🚀本文改进:面向移动端的轻量化网络模型——EMO,它能够以相对较低的参数和 FLOPs 超越了基于 CNN/Transformer 的 SOTA 模型,支持四个版本EMO_1M, EMO_2M, EMO_5M, EMO_6M,参数量如下,相对于自带的rtdetr-l、rtdetr-x有很大提升 layersparametersgradientsEMO_1…...

一些nginx命令

1.停止nginx nginx -s quit systemctl stop nginx.service 立即停止 nginx-s stop 杀死nginx进程 killall nginx 2.启动命令 nginx systemctl start nginx.service 3.查看nginx进程 ps aux | grep nginx 4.重启nginx服务 systemctl restart nginx.service 5.重载…...

WPF自定义控件介绍

在WPF中&#xff0c;自定义控件通常是指从头开始创建一个新控件或从现有控件继承并扩展其功能。自定义控件与用户控件&#xff08;User Control&#xff09;不同&#xff0c;用户控件是通过组合其他控件来构建的&#xff0c;而自定义控件通常涉及对控件的更底层的渲染和行为进行…...

JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍

参考文章&#xff1a; https://www.cnblogs.com/zhukaile/p/14514238.html&#xff0c;https://blog.csdn.net/qq_36448800/article/details/126438339 一、什么是单元测试 在平时的开发当中&#xff0c;一个项目往往包含了大量的方法&#xff0c;可能有成千上万个。如何去保…...

强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning

论文链接:Training Diffusion Models with Reinforcement Learning项目地址:Training Diffusion Models with Reinforcement Learning官方代码:https://github.com/kvablack/ddpo-pytorch/tree/maintrl实现:https://huggingface.co/docs/trl/ddpo_trainer🤗关注公众号 fu…...

【C语言】数组下标为啥从0开始?下标越界访问一定报错吗?

本篇文章目录 0. 相关文章1. 下标从0开始问题2. 数组下标越界不报错问题 0. 相关文章 指针与指针变量数组名不是首元素地址的的2个例外拨开指针和数组名之间的迷雾 1. 下标从0开始问题 原因是&#xff1a;数组下标访问本质是“指针解引用操作”&#xff0c;而指针又是地址&am…...

机器学习-搜索技术:从技术发展到应用实战的全面指南

在本文中&#xff0c;我们全面探讨了人工智能中搜索技术的发展&#xff0c;从基础算法如DFS和BFS&#xff0c;到高级搜索技术如CSP和优化问题的解决方案&#xff0c;进而探索了机器学习与搜索的融合&#xff0c;最后展望了未来的趋势和挑战&#xff0c;提供了对AI搜索技术深刻的…...

Axelar、J.P.Morgan Onyx、Apollo 完成概念验证,向跨区块链自动化投资领域探索

J.P.Morgan Onyx、Apollo、Axelar、Oasis Pro 以及 Provenance Block Chain 展开合作&#xff0c;共同进行互操作性概念验证&#xff08;Proof-of-Concept&#xff0c;PoC)。 新加坡 — Axelar Inc.、Oasis Pro 、Provenance Blockchain 与 J.P.Morgan Onyx 以及 Apollo 通过新…...

wpf devexpress添加TreeListControl到项目

此教程示范如何添加TreeListControl到项目和绑定控件自引用数据源&#xff1a; 添加数据模型 绑定tree&#xff0c;并添加如下字段到数据源对象&#xff1a; Key字段包含唯一值索引节点 Parent字段包含父索引节点 添加数据模型&#xff08;Employee和Staff类&#xff09;到…...

WPF创建自定义控件编译通过但是找不到资源

报错&#xff1a; 原因: 路径写错了&#xff1a; 不是这样&#xff1a; Source"pack://application:,,,/Controls/Styles/xTabControl.xaml" 而是这样&#xff1a; Source"pack://application:,,,/项目名;component/Controls/Styles/xTabControl.xaml …...

PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

传值&#xff1a;当使用传值的方式时&#xff0c;函数或方法会创建原始变量的一个副本&#xff0c;并将该副本传递给函数或方法。在函数或方法内部&#xff0c;对副本的任何修改都不会影响到原始变量。当函数或方法执行完毕后&#xff0c;副本被销毁&#xff0c;不再使用。 传引…...

es安装方式

es安装方式 1.下载镜像的方式 分词器 kibana和es和容器互通的方式 docker network create es-net开始拉去镜像的方式 docker pull kibana:7.12.1运行镜像的方式 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-…...

苍穹外卖项目笔记(2)

1 Nginx 反向代理和负载均衡 1.1 概念 【Tips】可以看到前端请求地址和后端接口地址并不匹配&#xff0c;这里涉及到 nginx 反向代理 &#xff0c;就是将前端发送的动态请求由 nginx 转发到后端服务器 使用 nginx 作反向代理的好处&#xff1a; 提高访问速度&#xff08;在请…...