反向代理:
- 四层代理
- 在传输层基于tcp/ip协议进行代理转发,只能实现基于IP和端口的负载均衡,四层代理无法获取http请求的url信息,只是对数据包转发,进行流量分发
- 七层代理
- 基于http协议的应用层代理,代理的是http的请求和响应
四层代理和七层代理的区别:
- 转发速度:
- 四层速度快:四层只需要转发数据包,而且是通过内核态转发(相当于走硬件)。不负责处理http请求,也不对数据包进行处理
- 七层速度慢:需要对http的协议进行处理,通过用户态转发(相当于走软件),需要进行一系列的验证和处理流程
- 使用场景:
- 四层适用于需要处理大并发连接请求的场景,只是针对tcp或者udp流量的转发
- 七层代理不适合高并发,需要对http请求进行深入处理和控制的场景,web应用程序的负载均衡等
正向代理和反向代理的区别:
-
反向代理:客户端访问代理服务器,代理服务器接收客户端的http请求,然后由代理服务器请求转发到内部的一组服务器上进行处理,响应结果也由代理服务器返回给客户,在此过程中,客户端并不知晓自己访问的是代理服务器还是内部服务器,从而达到隐藏内部服务器的真实IP地址的目的,七层代理就是反向代理的典型
-
正向代理也是访问代理服务器,但是客户端知道自己在访问代理服务器,由代理服务器来进行地址请求,vpn就是正向代理的典型
反向代理的作用:
- 负载均衡,请求分配到后台多个服务器上,分担服务器的负载压力,可以提高系统的可用性和稳定性
- 缓存加速,会话保持
- 安全保护,请求的是代理,响应的也是代理。后台的真实服务器隐藏了,保证了架构的安全
- 简化了整个系统的结构,只需要代理服务器和几台后端服务器,就可以形成一个逻辑服务,这个服务架构可以随时进行弹性伸缩(随时添加服务器)
反向代理如何实现:
- 七层代理模块:upstream 只能定义在http的模块之中
- 四层代理模块:stream 只能定义在全局模块当中,而且stream只能是ip+端口
负载均衡的算法
- 默认算法:轮询,最简单的算法,将请求轮流地分配到后端的算法,使用于后端服务器处理能力相近的情况,可以不声明
- 加权轮询,给后端服务器赋予不同的权重,在默认轮询的基础上,处理能力更高的服务器可以分配到更多的请求,权重高的会更多地被访问
- 最小连接数算法,配置后会把请求转发到当前连接数最少的后端服务器上,避免请求都集中在一台服务器上,一般配合加权轮询使用
- IP hash 算法,根据客户端的IP地址,计算出一个哈希值,然后将请求发送到对应的后端服务器,同一个客户端的请求会被分配到上一次转发的服务器,这就是nginx实现会话保持的方法
- URL hash 算法,根据客户端请求的URL计算一个哈希值,然后将请求发送到对应的后端服务器,访问的URL相同时会被分配到同一台服务器,请求的地址发生变化,轮询的服务器可能就会发生变化(不一定,运气好还是之前那台)