Nginx反向代理与负载均衡

embedded/2024/9/23 20:21:19/

文章目录

  • 一、反向代理
    • 实现http反向代理
    • 反向代理 动静分离
    • 缓存功能
    • 添加首部字段
    • IP透传
  • 二、负载均衡


一、反向代理

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能。
在这里插入图片描述

同构代理:同构代理是指代理服务器和后端服务器具有相同的软件和硬件环境,运行相同的操作系统和网络协议。在同构代理中,代理服务器和后端服务器之间的通信采用相同的通信协议和规范,数据传输的格式相同,处理方式也类似。由于代理服务器和后端服务器环境相似,因此可以更轻松地进行配置和管理,同时也有助于提高性能和减少出错几率。

异构代理:异构代理是指代理服务器和后端服务器之间采用不同的软件和硬件环境,可能运行不同的操作系统或使用不同的网络协议。在异构代理中,代理服务器可能需要处理和转换不同格式的数据,适应不同的通信协议,以便与后端服务器进行通信。由于代理服务器和后端服务器环境不同,可能需要额外的配置和调整以便进行有效的通信和数据处理。
在这里插入图片描述

实现http反向代理

proxy_pass;
用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式。也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持。
在这里插入图片描述
访问7-2代理服务器,然后代理服务器转交给7-3服务器。
在这里插入图片描述
“加不加/”的问题
是否在proxy_pass http://192.168.232.20; 后面加斜杠的问题。
如果后面没有/,则后面无url,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root。
如果后面有/,则后面有url,即有 / 符号,相当于置换,即访问/xxx时实际返回proxy_pass后面uri内容.此行为类似于alias 。
注意:如果location定义其uri时使用了正则表达式模式(包括,*,但不包括^~),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后。

504和502的区别
在关闭服务器的时候,或者服务器宕机时会显示502且速度特别快。在这里插入图片描述
设置策略,访问就会出现504。后端服务器无法响应,就会出现响应超时。
在这里插入图片描述

反向代理 动静分离

模拟场景,动态资源分配给30;静态资源分配给40。注意,需要有这个界面才行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓存功能

缓存功能,是用于代理服务器上,用于更快响应客户需求,不需要再去访问真实服务器。

注意:需要在http语句中配置定义缓存信息。

 proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建levels=1:2:3 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的keyinactive=120s  #缓存有效时间  max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的keyproxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

添加首部字段

nginx基于模块ngx_http_headers_module可以实现对后端服务器响应给客户端的报文中添加指定的响应首部字段。
add_header name value [always]; 添加响应报文的自定义首部。

add_header X-Via   $server_addr; #当前nginx主机的IP
add_header X-Cache $upstream_cache_status; #是否缓存命中
add_header X-Accel $server_name; #客户访问的域名

IP透传

主要作用:真实服务器只能获得代理服务器的地址,却看不到真的客户访问的地址,故使用IP透传功能,使得真实服务器既能看到代理服务器又能看到客户端的地址。

#proxy_set_header X-Real-IP $remote_addr;                   #只添加客户端IP到请求报文头部,转发至后端服务器proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

在这里插入图片描述
在这里插入图片描述
这样就可以看到客户端的IP信息。

二、负载均衡

实现基本负载均衡

上述内容只是将客户端请求转发至单台服务器但是无法转发至特定的一组服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。
在这里插入图片描述
注意一定要在http语句块中。
在这里插入图片描述
在这里插入图片描述
同样的IP的地址显示的是不同信息,说明访问的后端服务器不一样,故负载均衡实现。

语法:

weight=number  #设置权重,默认为1,实现类似于LVS中的加权轮询等
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算。

调度算法

实际生产环境中,后端服务器的性能不一致,我们需要通过加权,改变算法的方式来使后端服务器正常工作。这里就会引入hash算法。
简单来说,hash算法就是利用用户的一些参数,进行加密运算,然后取模运算,最后就会得出相对应的服务器。

基本的hash算法:
hash $request_uri #基于用户请求的uri做hash
hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
ip_hash。
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持。
least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器。
fair
#此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。

http {upstream web {hash $remote_addr;server 192.168.232.30:80;server 192.168.232.40:80;
}http {upstream web {hash $request_uri;#发请求的地址,一旦定下不会轻易改变server 192.168.232.30:80;server 192.168.232.40:80;
}

http://www.ppmy.cn/embedded/48897.html

相关文章

Spring Boot 的启动原理、Spring Boot 自动配置原理

Spring Boot启动原理包含自动装配原理。 Spring Boot 的启动原理: 1. 入口类与 SpringApplication 初始化: 应用程序通常从一个带有 SpringBootApplication 注解的主类开始,这个注解是一个组合注解,包含了 SpringBootConfigurat…

Github 2024-06-10开源项目周报 Top15

根据Github Trendings的统计,本周(2024-06-10统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8Jupyter Notebook项目2Go项目2C++项目1Shell项目1Lua项目1JavaScript项目1MDX项目1C项目1HTML项目1Python - 100天从新手到大师 创建…

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群 第一步 安装 Docker, Windows 上可以使用 Docker Desktop 下载地址:https://www.docker.com/products/docker-desktop/ 安装过程自行谷歌 安装好的标志:打开终端 运行docker p…

高等数学与初等数学的分水岭是什么?

高等数学与初等数学的分水岭是什么? 高等数学与初等数学的一个重要分水岭可以认为是极限的概念。 在初等数学中,主要涉及常量的运算和一些简单的函数关系等。而当引入极限概念后,数学的研究范围和方法发生了很大变化。高等数学围绕极限展开了…

安全测试框架 二

使用安全测试框架进行测试,可以遵循以下步骤进行,以确保测试的全面性和系统性: 一、明确测试目标和需求 确定测试的范围和重点,明确要测试的系统或应用的安全性方面的关键点和重要性。根据业务需求和安全标准,制定详…

【three.js】旋转、缩放、平移几何体

目录 一、缩放 二、平移 三、旋转 四、居中 附源码 BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。 我们先创建一个平面物体,样子是这样的。 一、缩放 // 几何…

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛(ARCHE-2024)将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展,将以全新形象盛装亮相,展示其在档案管理领域的最新技术和解决方案。 ARC…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …