Nginx负载均衡详解

2023-09-22 07:30:00

一、负载均衡介绍

1、负载均衡的定义

单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理。

在这个过程中,调度者如何合理分配任务,保证所有服务器将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡的需要处理的问题了。

2、nginx负载均衡

nginx在 nginx.conf配置文件中通过 upstream模块 和 server模块的配合使用,就可以实现负载均衡。

2.1 upstream 模块

upstream 模块:负载均衡模块,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。

在http的 upstream模块中,可以通过 server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。

常用的状态有:

  • weight:服务访问的权重,默认是1。
  • down:表示当前的server暂时不参与负载均衡。
  • backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails:在fail_timeout时间内,允许请求最大的失败次数,默认为1。当达到最大失败时,会在fail_timeout时间内不允许再次被选择。,返回 proxy_next_upstream 模块定义的错误。
  • fail_timeout:单位为秒,默认是10秒。指定一段时间内,请求经历了max_fails次失败后,该server不能访问的时间(暂停服务的时间)。max_fails可以和fail_timeout一起使用。

注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是backup。

2.2 nginx负载均衡配置

nginx.conf 负载均衡的基本配置内容如下,以轮询策略为例:

worker_processes  1;

events {
  	worker_connections  1024;
}
 
 
http {
		# upstream模块:server_group_name 自定义服务组名
    upstream  server_group_name {
    		# server指令指定后端服务器的IP地址和端口
        server    localhost:8080;
        server    192.168.xxx.xxx:8081 down;
        server    192.168.xxx.xxx:8082  max_fails=3  fail_timeout=20s;
        server    192.168.xxx.xxx:8083;
    }
    
 		# server模块
    server {
        listen       80;
        server_name  localhost;
 
        location / {
         		# proxy_pass:代理转发,将单体服务http://127.0.0.1:80,改为服务组名
         		proxy_pass http://server_group_name/;
         		# proxy_redirect default;
        }
    }
}

二、Nginx负载均衡实战

浏览效果:在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到两台服务器中,访问时会出现不同界面。。

1、准备工作

这里准备两台tomcat服务器,一台服务器的端口为8080,另一台服务器的端口为8080;

在这两台tomcat服务器的webapps目录中的 ROOT文件夹中创建一个 test.html文件,用于测试。

# 添加 html文件并加入内容
echo "<h1>This is 8080 Port</h1>" > /usr/local/tomcat8080/webapps/ROOT/test.html
echo "<h1>This is 8080 Port -------</h1>" > /usr/local/tomcat8080/webapps/ROOT/test.html

启动两个tomcat服务。

#启动tomcat8080
/usr/local/tomcat8080/bin/startup.sh

浏览器直接访问tomcat服务。

在这里插入图片描述

2、Nginx负载均衡配置

第一步:修改Nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf

配置内容如下,以轮询策略为例:

worker_processes  1;

events {
  	worker_connections  1024;
}
 
 
http {
    # upstream模块:自定义服务组名
    upstream my_tomcat_server {
    	 server 192.168.xxx.1xx:8080;
    	 server 192.168.xxx.2xx:8080;
    }

    server {
    	 listen       80;
	     server_name  192.168.xxx.xxx;  # 指定虚拟主机的IP,或者外网域名
    
    	 location / {
    		  root   html;
    		  # proxy_pass:代理转发,指定我们配置负载均衡的服务名my_tomcat_server
    		  proxy_pass http://my_tomcat_server; 
    		  index  index.html index.htm; 
    	 }
    }
}

第二步:重启Nginx

修改 nginx完之后,保存退出,重启Nginx。

/usr/local/nginx/sbin/nginx -s reload

# 先执行停止命令再执行启动命令
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx

第三步:浏览器访问OK

在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到到这两台服务器中,所以,访问时会出现不同界面。

在这里插入图片描述

第四步:关闭服务

#关闭Nginx
/usr/local/nginx/sbin/nginx -s quit
#关闭tomcat
/usr/local/tomcat8080/bin/shutdown.sh
/usr/local/tomcat8080/bin/shutdown.sh

三、Nginx负载均衡分配策略介绍

1、轮询[默认]

轮询方式是Nginx负载默认的方式。

该策略会使得每个请求按时间顺序逐一分配到不同的后端服务器,如果其中某个后端服务器 down 掉,该策略能自动从轮询列表中剔除该服务。

轮询方式是将所有请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

    # upstream模块:自定义服务组名
    upstream my_tomcat_server {
    	 server localhost:8080; # 服务器的ip:port
    	 server 192.168.xxx.xxx:8081;
    }

2、权重(weight)

该策略会指定每个服务的权重比例,权重越高被分配的客户端(请求)也就越多,weight 和访问比率成正比。主要用于后端服务器性能不均的情况。

  • weight指定轮询权值,默认值为1。通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能。

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

    upstream my_tomcat_server {
    	 server localhost:8080  weight=2;
    	 server 192.168.xxx.xxx weight=5; # 权重设置为5,5>2,所以请求时会多跳转到这个服务
    }

3、ip_hash(哈希)

该策略会按照每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。有效解决了动态网页存在的session共享问题。

源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

注意:ip_hash和 weight也可以配合使用。

    upstream my_tomcat_server {
		ip_hash;
    	server localhost:8080;
    	server 192.168.xxx.xxx; 
    }
# ip_hash和 weight也可以配合使用
    upstream my_tomcat_server {
		ip_hash;
    	server localhost:8080  weight=1;
    	server 192.168.xxx.xxx weight=2;
    }

4、最少连接(least_conn)

该策略会将请求分配到连接数最少的服务上。

    upstream my_tomcat_server {
		least_conn;
    	server localhost:8080;
    	server 192.168.xxx.xxx; 
    }

5、第三方策略

Nginx支持集成第三方的策略插件。

比如:

  • fair:此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,即响应时间短的优先分配。比上面更加智能的负载均衡算法。下载安装 Nginx的upstream_fair模块。
  • url_hash:按访问 url的 hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。下载安装 Nginx 的hash软件包。

– 求知若饥,虚心若愚。

更多推荐

【面试经典150 | 双指针】判断子序列

文章目录写在前面Tag题目来源题目解题解题思路方法一:双指针方法二:动态规划写在最后写在前面本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:Tag:介绍本题牵涉到的知识点、

zookeeper —— 分布式服务协调框架

zookeeper——分布式服务协调框架一、Zookeeper概述1、Zookeeper的基本概念2、Zookeeper的特点3、Zookeeper的数据结构二、Zookeeper的安装部署1、Zookeeper的下载2、Zookeeper的安装本地模式(单机模式standalone)安装部署分布式(集群模式clust

【结构型】代理模式(Proxy)

目录代理模式(Proxy)适用场景代理模式实例代码(Java)代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。适用场景远程代理(RemoteProxy)为一个对象在不同地址空间提供局部代表。虚代理(VirtualProxy)根据

设计模式:享元模式

享元模式(FlyweightPattern)是一种用于效率的优化模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。它适用于那些需要大量使用相似对象,但又不需要每个对象都拥有完全独立的状态的情况。在享元模式中,我们将对象分为两个部分:内部状态和外部状态。内部状态是存储在享元对象中的,并且可以被多个享元对象共享。

jmeter线程组 bzm - Concurrency Thread Group & 阶梯式压测

简介bzm-ConcurrencyThreadGroup不是JMeter的官方插件,而是一种由Blazemeter提供的高级线程组插件,它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程,模拟不同的负载场景。插件下载地址(jmeter版本不低于3.2):https://jmeter-plugi

phpstudy RCE脚本编写(Python)

文章目录编写过程脚本优化编写过程关于phpstudy2016-2018RCE漏洞的验证,请移步我的这篇博客phpstudy2016RCE漏洞验证。将之前漏洞验证的数据包复制下来,编写脚本时需要使用:GET/phpinfo.phpHTTP/1.1Host:10.9.75.164Upgrade-Insecure-Reque

Python 在 JMeter 中如何使用?

要在JMeter中使用Python,需要使用JSR223Sampler元素来执行Python脚本。使用JSR223Sampler执行Python脚本时,需要确保已在JMeter中配置了Python解释器,并设置了正确的环境路径。1、确保JMeter已安装Python解释器,并将解释器的路径添加到计算机的环境变量中。2、

zookeeper未授权漏洞复现及处理

一、漏洞详情Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。Zookeeper的默认开放端口是2181。Zookeep

RFID设备在自动化堆场中的管理应用

随着信息技术的高速发展,带动了港口生产和管理技术的长足进步,港口堆场内的自动化场桥的智能化水平成为码头提高生产率一个重要标签。各地海关着力于现代化科技手段,努力构筑新型的便捷通关模式,在进出口环节做好管理和服务。全球港口场桥设备中轮胎式起重机(以下简称轮胎吊)占据比例较大,轨道式起重机占据比例较小。因此,自动化、智能化

自动化和数字化在 ERP 系统中意味着什么?

毋庸置疑,ERP系统的作用是让工作更轻松。它可以集成流程,提供关键分析,确保你的企业高效运营。这些信息可以提高你的运营效率,并将有限的人力资本重新部署到更有效、更重要的需求上。事实上,自动化和数字化是ERP系统最显著的两个优势。那么,这些功能是什么?它们如何帮助企业蓬勃发展?在这两个关键因素的范围内,你需要的是什么?什

Jmeter 自动化性能测试常见问题汇总

一、request请求超时设置timeout超时时间是可以手动设置的,新建一个http请求,在“高级”设置中找到“超时”设置,设置连接、响应时间为2000ms。1.请求连接超时,连不上服务器。现象:Jmeter表现形式为:前面几个请求是成功的,但是后面请求有的会报错,有的请求成功报错1:Responsecode:Non

热文推荐