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
apache基于端口创建虚拟主机的示例
Apr 24 Servers
详解使用内网穿透工具Ngrok代理本地服务
Mar 31 Servers
如何通过cmd 连接阿里云服务器
Apr 18 Servers
nginx配置之并发频次限制
Apr 18 Servers
KVM基础命令详解
Apr 30 Servers
使用 Docker Compose 构建复杂的多容器App
Apr 30 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
本地搭建minio文件服务器(使用bat脚本启动)的方法
Jul 15 Servers
apache虚拟主机配置的三种方式(小结)
Jul 23 Servers
Win10系统搭建ftp文件服务器详细教程
Aug 05 Servers
keepalived + nginx 实现高可用方案
Dec 24 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实现多级树型菜单
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
Jquery插件写法笔记整理
2012/09/06 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
Python实现调度算法代码详解
2017/12/01 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
英文翻译的自我评价语句
2013/10/04 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python