Nginx实现负载均衡的项目实践


Posted in Servers onMarch 18, 2022

一、Nginx介绍

Nginx是一款高性能的Http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器(电子邮件代理),最早开发这个产品的目的之一也是作为邮件代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗及其高并发性能强而广泛应用于各种生产部署之中。而且nginx是基于事件驱动模型(epoll)实现的I/O多路复用,并通过异步、非阻塞的方式处理请求。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。而我们为什么要选择Nginx呢?

二、Nginx特点

  • 高并发、高性能;
  • 高可靠(可以7*24小时不间断运行);
  • 可扩展性强(高度模块化设计,添加模块平稳);
  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接;
  • 作为负载均衡服务器:可以进行自定义配置,支持虚拟主机、支持URL重定向、支持网络监控等。
  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs少;
  • 处理静态文件,索引文件以及自动索引;
  • 反向代理加速(无缓存),简单的负载均衡和容错;
  • 支持热部署(可在不停止服务器的情况下升级nginx)。

这就是为什么要选择Nginx的原因。而且Nginx的功能特点还不止这些,上面只是简单列举了几点常见功能。

三、Nginx负载均衡

在我们实际生产中,一台服务器的处理能力、存储空间是有限的, 不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器来分担原有服务器的访问及存储压力。实际上这就是我们所谓的负载均衡,Nginx作为负载均衡服务器,它通过反向代理来对后端多台服务器负载均衡。首先来说一下Nginx负载均衡策略及负载均衡算法。

3.1 认识 upstream 模块

upstream 这个模块是写一组被代理的服务器地址(即定义的后端服务器列表中选取一台服务器接受用户的请求 ),然后配置负载均衡的算法。 来看一下最基本的负载均衡实例:

upstream test { 
      server 10.20.151.114:80;
      server 10.20.151.115:80;
}
server {
      ....
      location / {         
             proxy_pass  http://test;     --请求转向 test 定义的服务器列表         
      }

3.2 Nginx负载均衡策略

(1)轮询

最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

upstream test { 
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;
}

(2)ip_hash

每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

upstream test { 
	  ip_hash;  --同一个IP客户端固定访问一个后端服务器
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;
}

(3)url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

upstream test { 
	  hash $request_uri;  --实现每个url定向到同一个后端服务器
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;
}

(4)least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

upstream test { 
	  least_conn;  --把请求转发给连接数较少的后端服务器
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;
}

(5)weight

权重方式,在轮询策略的基础上指定轮询的几率。

upstream test { 
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;  --轮询的几率相对上一条要大
}

(6)fair

此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream test { 
      server 10.20.151.114:80; weight=1;
      server 10.20.151.115:80; weight=2;
      fair;  --实现响应时间短的优先分配
}

nginx负载均衡配置状态参数

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

Nginx可分为二层、三层、四层、七层负载均衡。 所谓的二层就是基于MAC地址的负载均衡, 三层就是基于IP地址的负载均衡,四层就是基于IP+端口的负载均衡,七层就是基于URL等应用层信息的负载均衡。因篇幅较长这里不再做具体的介绍,有兴趣的可自行百度。这里以七层负载均衡来做实例。

3.3 Nginx负载均衡实例

环境准备:准备3台Nginx服务器,一台作为负载均衡服务器,其它两台作为后端服务器。

10.20.151.240 ----proxy_server(负载均衡服务器)

10.20.151.112 ----server1(后端服务器1)

10.20.151.113 ----server2(后端服务器2)

(1)负载均衡服务器配置

vim /etc/nginx/nginx.conf        --配置主配置文件
vim /etc/nginx/conf.d/test.conf  --配置子配置文件

Nginx实现负载均衡的项目实践

Nginx实现负载均衡的项目实践

(2)后端服务器配置

vim /usr/local/nginx/conf/nginx.conf    --修改配置文件
vim /usr/local/nginx/html/index.html    --添加测试数据

Nginx实现负载均衡的项目实践

Nginx实现负载均衡的项目实践

(3)负载均衡测试

在浏览器端访问http://10.20.151.240/,在实际生产中,这两个页面返回的结果是一样的,这里是为了测试效果,所以返回了不同的内容。而为什么刷新后又会返回不同结果呢?那是因为负载均衡默认的均衡策略(或算法)是轮询,所以每刷新一次就会从不同的后端服务器返回不同的请求结果,减轻单个后端服务器的访问量,提升客户端的访问效率,从而达到负载均衡的效果。

Nginx实现负载均衡的项目实践

Nginx实现负载均衡的项目实践

当我添加权重(weight)时

Nginx实现负载均衡的项目实践

再次访问http://10.20.151.240/

Nginx实现负载均衡的项目实践

Nginx实现负载均衡的项目实践

加权重和没加权重有什么区别呢?在实际生产中,我们一般会将配置较高的服务器的权重设置高一点,其实就是客户端在访问时,权重较高的服务器会被多次请求,这样能减轻配置较低的服务器的请求量,从而更好的实现负载均衡。

当我添加backup状态参数时

Nginx实现负载均衡的项目实践

再次访问http://10.20.151.240/

Nginx实现负载均衡的项目实践

此时我故意停掉第一台后端服务器,继续访问http://10.20.151.240/

Nginx实现负载均衡的项目实践

当我给113这台后端服务器添加backup后,它就会作为热备服务器,添加的主要目的就是当我其他后端服务器都宕机的情况下,我的热备服务器还能继续提供同样的服务(注意:在其他后端服务器还未宕机之前,该热备服务器是不工作的)。因此负载均衡不仅能达到各个后端服务器负载的均衡,同时通过配置相关转态参数还能保证客户端请求时不造成服务器宕机的情况,保证了后端服务器的稳定性。其他状态参数这里我不再做演示(因为配置方式都一样)。

总结

通过上述简单案例不难看出负载均衡的重要性,不管是大中小型企业,都会用到负载均衡,尤其是某些大型购物网站,如果不做负载均衡,估计刚上线几分钟后端服务器就会被客户端的请求给弄瘫痪了。因此Nginx负载均衡实现的就是后端服务器的平均分摊客户端的访问压力,同时借助Nginx的高并发、高性能、高可靠性等特点,对我们的实际生产提供了最大化服务和性能保障。

到此这篇关于Nginx实现负载均衡的项目实践的文章就介绍到这了,更多相关Nginx 负载均衡内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx 过滤静态资源文件的访问日志的实现
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
nginx实现动静分离的方法示例
Nov 07 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
CentOS下安装Jenkins的完整步骤
Apr 07 Servers
阿里云k8s服务升级时502错误 springboot项目应用
Apr 09 Servers
nginx 配置缓存
May 11 Servers
利用nginx搭建RTMP视频点播、直播、HLS服务器
May 25 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
nginx七层负载均衡配置详解
Jul 15 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 Servers
Nginx报错104:Connection reset by peer问题的解决及分析
Jul 23 Servers
Nginx中使用Lua脚本与图片的缩略图处理的实现
Mar 18 #Servers
nginx刷新页面出现404解决方案(亲测有效)
Mar 18 #Servers
Nginx+Windows搭建域名访问环境的操作方法
Mar 17 #Servers
nginx中封禁ip和允许内网ip访问的实现示例
Mar 17 #Servers
Apache Linkis 中间件架构及快速安装步骤
关于Nginx中虚拟主机的一些冷门知识小结
Mar 03 #Servers
nginx负载功能+nfs服务器功能解析
You might like
php session和cookie使用说明
2010/04/07 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php中的登陆login实例代码
2016/06/20 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue实现微信分享功能
2018/11/28 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python对json的相关操作实例详解
2017/01/04 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
美国批发供应商:Kole Imports
2019/04/10 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
童装店创业计划书
2014/01/09 职场文书
加工操作管理制度
2014/01/19 职场文书
房产公证书范本
2014/04/10 职场文书
吨的认识教学反思
2014/04/27 职场文书
小学数学课题方案
2014/06/15 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
倡议书的格式写法
2015/04/28 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏