Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-28) 阅读数 63 #未命名

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

大家好,我是哪吒。

这个系列是SpringCloud微服务系列。开始向微服务网关Nginx学习,阅读哪吒的程序,体验技术生活。 ?看起来他在班上走在前面。

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


慢慢变成了JSP+SSM架构。

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


目前最流行的架构是SpringBoot+Vue

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


然而,随着业务量的不断增加,你会发现这种单一的架构已经跟不上当今不断增长的数据扩展。 QPS很容易达到几万、几十万。我记得当时是200QPS的时候,感觉还蛮恐怖的。

为了解决性能问题,微服务架构SpringCloud逐渐出现。微服务的核心概念是搜索应用程序并将单个应用程序拆分为多个较小的应用程序。每个小应用提供单一、独立分布的业务功能,服务之间相互调用,减少程序耦合,解决单服务器宕机问题。

微服务提供:

  1. 高可用性:当一个节点服务器宕机时,流量可以快速转移到另一个节点;
  2. 高性能:多台服务器对外提供相同的服务,提高程序吞吐量;
  3. 高扩展:当业务增加时,可以通过增加节点来解决性能问题;

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

注:本章的重点是Nginx和其他微服务组件,我不会再画了。

2。什么是 Nginx?

Nginx 是俄罗斯人 Igor Sysoev 编写的高性能 HTTP 和反向代理服务器。 Nginx选择epoll和kqueue作为网络I/O模型。在高连接并发的情况下,Nginx 是 Apache 服务器的一个很好的替代方案。可以支持高达50000个同时连接的响应,运行稳定,并且具有良好的内存,CPU等系统资源消耗很低。 ? .nzbc \.com$;。如果开头没有,Nginx 会将其定义为完整匹配。从逻辑上讲,应该添加 ^ 和 $ 锚符号。在通常的匹配格式中,.是常规元字符,必须用反斜杠转义。如果表达式中包含{},则必须用双引号引起来以避免错误。

4。正向代理和反向代理

1。正向代理

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

正向代理服务器一般位于用户和服务器之间。 用户通过转发代理服务器访问应用服务器来获取资源。

最常见的例子就是我们访问国外网站时,内部无法直接访问,但可以通过代理服务器访问。即用户向转发代理服务器发送请求并确定目标,然后代理服务器将请求转发到目标服务器(国外网站)并将获取的内容返回给用户。

转发代理服务器,充当客户端与服务器通信的代理。

2。反向代理

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

反向代理服务器一般位于用户和服务器之间。 用户访问反向代理服务器,获取应用服务器资源。用户不知道应用服务器的地址。通过代理服务器转发,可以减轻网络和服务器的负载,提高访问效率。

反向代理服务器充当服务器与客户端通信的代理。

Nginx 是一个高性能的反向代理服务器。

3。 LVS

先说结论吧。 LVS解决了Nginx的性能瓶颈。

LVS主要用于多服务器负载均衡。它工作在网络的第四层,可以实现高性能、高可用性的服务器集群技术,采用同步请求转发策略。

LVS支持比Nginx更高的并发,并且可以与keepalived配合使用Nginx作为LVS节点引擎,因为Nginx处于网络第七层,肯定比LVS更强大。

用户通过Nginx访问应用服务器,应用服务器直接将数据返回到机房路由,返回时无需经过Nginx,降低了Nginx的性能消耗。

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

5.负载均衡策略

1.轮询

默认情况下,采用轮询方式进行一对一访问。这种情况适合无状态请求,会话无法维持。会话可以逐个客户端进行管理。

会话保留方式:

(1)基于会话实现:

会话用于存储客户端用户信息。一般来说,会话​​不存储在服务器上。会话可以通过SpringSession存储在Redis服务器上。当您再次访问时,可以从Redis服务器检索会话,实现会话共享。

(2)基于cookie实现的无状态会话保持方法

客户端访问时,先到权限验证服务器验证权限,生成cookie,并加密。只有服务器端可以解密,客户端没有密码就无法解密。客户端拿着这个cookie再次访问应用服务器,应用服务器进行解密验证,完成无状态会话保持。

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

2。重量

重量通过上游确定。

  1. weight:权重
  2. down:离线不再需要
  3. backup:备份服务器

修改配置文件后,需要通过命令❀ ngxct重启Nginx。

nginx.conf配置如下

http{
	upstream httpnz {
		server 192.168.66.1 weight=1 down;
		server 192.168.66.2 weight=5 backup;
		server 192.168.66.3 weight=10;
	}
	server{
		listen 80;
		server_name nzbc;
		
		location / {
			proxy_pass http://httpnz;
		}
	
		error_page 500.html;
		location = /500.html{
			root html;
		}
	}
}
复制代码

3。 ip_hash

每个请求都会根据访问IP的哈希结果进行分配,并映射到固定的服务器上,这样会导致负载均衡不平衡。

当该应用程序服务器出现故障时,会话将丢失。当再次发出请求时,将恢复对另一台正常应用服务器的访问,并保持会话。

4,least_conn

最少连接访问。

5。 url_hash

根据打开的URL转发请求,转发定向流量。

每个请求都会根据访问URL的哈希结果进行分配,并映射到固定的服务器。会话无法维持。

一般用于获取本地资源时(且本地资源不在同一台服务器上),比如通过地址1获取图片资源,通过地址2获取pdf协议资源。

6,公平

转发请求基于服务器响应时间。

7。总结

最常用的负载均衡策略是权重管理。其他形式不常用。

ip_hash、least_conn、url_hash、fair,形式无法获取动态Nginx上下线(增减Nginx服务器),也会造成流量倾斜问题。如果流量比较快,会立即跳转到某个服务器

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

6、动静态资源分离

动静分离的主要目的是分离静态资源和动态资源的获取,提高服务器性能和高可用性。

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

静态资源配置。配置nginx.conf如下

http{
	upstream httpnz {
		server 192.168.66.1 weight=1 down;
		server 192.168.66.2 weight=5 backup;
		server 192.168.66.3 weight=10;
	}
	server{
		listen 80;
		server_name nzbc;
		
		location / {
			proxy_pass http://httpnz;
		}
		
		location ~*/(js/img/css) {
			root html;
			index index.html index.htm;
		}
		
		error_page 500 502 503 504 /50x.html;
		location = /50x.html{
			root html;
		}
	}
}
复制代码

7. URLRewrite

URLRrewrite是实现URL重写的关键指令。重定向基于 regex(正则表达式)部分。

旗标说明:

  1. 休息,比赛结束后终止;
  2. 至少,这场比赛结束后,继续往下走;
  3. 重定向,返回302临时重定向;
  4. 永久,返回301永久重定向;

配置URLRewrite,配置nginx.conf如下

http{
	upstream httpnz {
		server 192.168.66.1 weight=1 down;
		server 192.168.66.2 weight=5 backup;
		server 192.168.66.3 weight=10;
	}
	server{
		listen 80;
		server_name nzbc;
		
		location / {
			rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
			proxy_pass http://httpnz;
		}
		
		location ~*/(js/img/css) {
			root html;
			index index.html index.htm;
		}
		
		error_page 500 502 503 504 /50x.html;
		location = /50x.html{
			root html;
		}
	}
}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门