当前位置: 首页 > 科技观察

图解Nginx、系统架构演进+Nginx反向代理与负载均衡

时间:2023-03-14 14:48:14 科技观察

大家好,我是哪吒。本系列为SpringCloud微服务系列。从微服务入口Nginx开始学习,读懂哪吒编程,体验科技人生。一、系统架构的演变刚接触Java语言时,我写的第一个项目是图书馆管理系统。当时是用JSP+servlet写的。慢慢就变成了JSP+SSM架构。目前为止最流行的SpringBoot+Vue单体架构。但是随着业务量的不断增加,你会发现这些单一的架构已经不能满足今天日益增长的数据膨胀,动辄几万、几十万的QPS。我记得原来是200QPS,我觉得挺吓人的。为了解决性能问题,微服务SpringCloud架构逐渐浮出水面。微服务的核心理念是将应用细粒度化,将单个应用拆分成若干个小应用。每个小应用提供单一业??务功能,独立Deployment,服务相互调用,降低程序耦合,解决单台服务器宕机问题。微服务提供:高可用:当一个节点服务器宕机时,可以快速将流量转移到其他节点;高性能:多台服务器对外提供相同的服务,提高程序的吞吐量;高扩展:当业务出现激增时,可以通过增加节点来解决性能问题;微服务说明:本章重点介绍Nginx,微服务的其他组件不再绘制。2.什么是Nginx?Nginx是由俄罗斯人IgorSysoev编写的高性能HTTP和反向代理服务器。Nginx选择epoll和kqueue作为网络I/O模型。在高连接并发的情况下,Nginx是Apache服务器的一个很好的替代品。最大支持5万并发连接响应,运行稳定。系统资源消耗非常低。3.servername匹配规则完全匹配通配符匹配正则匹配正则匹配格式必须以~开头,如server_name~^www\d+\.nzbc\.com$;。如果没有~开头,Nginx会判断为完全匹配。从逻辑上讲,需要添加^和$锚符号。在正则匹配格式中,.是常规元字符,需要使用反斜杠进行转义。如果表达式中包含{},需要用双引号括起来,以免报错。四、正向代理和反向代理1、正向代理正向代理服务器一般位于用户和服务器之间,用户通过正向代理服务器访问应用服务器获取资源。最常见的例子就是我们访问一个国外的网站,在国内不能直接访问,但是可以通过代理服务器访问,即用户向转发代理服务器发送请求并指定目标,然后进行转发代理服务器向目标服务器(国外网站)转发请求,并将获取的内容返回给用户。转发代理服务器,代理就是客户端,与服务器进行交互。2.反向代理反向代理服务器一般位于用户和服务器之间。用户访问反向代理服务器获取应用服务器资源时,用户不知道应用服务器的地址,由代理服务器转发,减少了网络和服务器。负载,提高访问效率。反向代理服务器充当服务器与客户端交互的代理。Nginx是一个高性能的反向代理服务器。3、LVS先总结一下,LVS解决了Nginx单机性能瓶颈问题。LVS主要用于多服务器负载均衡,工作在网络第四层,可以实现高性能、高可用的服务器集群技术,采用同步请求转发策略。LVS支持的并发比Nginx高,可以配合keepalived使用。使用Nginx作为LVS的节点机,因为Nginx在网络的第七层,功能肯定比LVS强。用户通过Nginx访问应用服务器,应用服务器直接将数据返回给机房的路由器,返回时不使用Nginx,减少了Nginx的性能消耗。Nginx+LVS五、负载均衡策略1.轮询默认采用轮询的方式,访问一一转发。这种情况适用于无状态请求,无法保持session。会话可以基于客户端来维护。Session保留方法:(1)基于Session的实现:session用于存储客户端用户信息,一般不会在服务器中存储session,可以通过SpringSession将session存储在一个Redis服务器中,再次访问时,可以获取Redis服务器中的session,实现session共享。(2)基于cookie实现,无状态会话保持方式:客户端访问时,先去权限验证服务器验证权限,生成cookie,加密,只有服务器能解密,客户端无法解密它没有密码。终端携带此cookie再次访问应用服务器,应用服务器进行解密验证,完成无状态会话保持。2.权重是通过upstream定义的。weight:weightdown:无需下线backup:备份服务器修改配置文件后,需要通过systemctlreloadnginx命令重启Nginx。nginx.conf配置如下:http{upstreamhttpnz{server192.168.66.1weight=1down;服务器192.168.66.2weight=5备份;服务器192.168.66.3权重=10;}服务器{听80;服务器名称nzbc;位置/{proxy_passhttp://httpnz;}error_page500.html;location=/500.html{根html;}}}3.每个ip_hash请求根据访问ip的hash结果分配,映射到固定服务器,会造成负载均衡不均衡。当应用服务器宕机时,session会丢失,当再次发起请求时,会重新连接到另一台正常的应用服务器,并保持session。4.least_conn最少连接访问。5、url_hash根据访问的url转发请求,定向流量转发。每个请求根据访问URL的哈希结果进行分发,并映射到固定的服务器,无法维持会话。一般在获取本地资源(且本地资源不在同一台服务器上)时使用,比如通过地址1获取图片资源,通过地址2获取pdf协议资源。6.Fair根据服务器响应转发请求时间。7.小结最常用的负载均衡策略就是配置权重。其他形式不是很常用。ip_hash、least_conn、url_hash、fair,这些形式无法实现动态的Nginx上下线(增减Nginx服务器),也会造成流量倾斜的问题。如果瞬间流量爆发,某台服务器直接干跳。六、动静分离动静分离的最终目的是分离静态资源和动态资源的获取,提高服务器性能和高可用性。配置静态资源,nginx.conf配置如下:http{upstreamhttpnz{server192.168.66.1weight=1down;服务器192.168.66.2weight=5备份;服务器192.168.66.3权重=10;}服务器{听80;服务器名称nzbc;位置/{proxy_passhttp://httpnz;}location~*/(js/img/css){roothtml;indexindex.htmlindex.htm;}error_page500502503504/50x.html;位置=/50x。html{根html;}}}七。URLRewriteURLRewrite是实现URL重写的关键指令,根据regex(正则表达式)的一部分进行重定向。flag标签说明:break,比赛结束后本文将终止。最后,本文匹配完成后,继续向下匹配。重定向,返回302临时重定向。permanent,return301永久重定向。配置URLRewrite,nginx.conf配置如下:http{upstreamhttpnz{server192.168.66.1weight=1down;服务器192.168.66.2weight=5备份;服务器192.168.66.3权重=10;}服务器{听80;服务器名称nzbc;location/{重写^/([0-9]+).html$/index.jsp?pageNum=$1break;proxy_passhttp://httpnz;}location~*/(js/img/css){roothtml;indexindex.htmlindex.htm;}error_page500502503504/50x.html;location=/50x.html{根html;}}}本文转载自微信公众号《哪吒编程》,可关注下方二维码关注。转载本文请联系哪吒编程公众号。