目录
代理
代理
-
客户端通过一个指定的服务器,访问其他服务器,请求和响应都由指定服务器来为客户端进行处理。这个指定的服务器就是代理服务器。
-
vpn就是正向代理,当访问代理服务器时,客户端知道访问的是代理,代理服务器的地址请求。
正向代理:
-
角色: 正向代理位于客户端和目标服务器之间,代表客户端向服务器发起请求。
-
功能: 客户端通过正向代理向目标服务器发送请求,然后正向代理将请求转发给目标服务器,并将收到的响应返回给客户端。目标服务器不知道实际发起请求的客户端,因为请求似乎是由代理发起的。
-
配置: 客户端需要进行特定的设置,指定正向代理的地址、端口等信息,以便请求通过代理服务器。
反向代理:
-
角色: 反向代理位于目标服务器和客户端之间,代表服务器向客户端提供服务。
-
功能: 客户端发送请求给反向代理,然后反向代理决定将请求转发给哪个目标服务器。客户端不知道实际提供服务的服务器,因为似乎所有的服务都来自于反向代理。
-
配置: 客户端无需特别配置,只需将请求发送到反向代理,而反向代理负责将请求转发到实际提供服务的服务器。
总体来说,正向代理隐藏了客户端的身份,使得客户端似乎是通过代理向服务器发起请求;而反向代理隐藏了服务器的身份,使得客户端似乎是直接与代理通信而不知道实际提供服务的服务器。这两种代理的作用都是在请求和响应之间起到中间人的作用,但方向和目的不同。
四层代理:
-
工作层次: 四层代理主要工作于OSI模型的传输层(第四层)。
-
功能: 主要处理消息的传递,关注于IP地址和端口号的信息。四层代理通常只检查和操作网络数据包的目标IP地址和端口号,而不涉及应用层面的内容。
-
负载均衡: 四层负载均衡器主要针对由上游服务发送和接收的网络包,而不关心这些数据包中的具体内容。
-
性能: 由于操作较低层次的信息,通常在传输大量数据时,性能相对较高。
七层代理:
-
工作层次: 七层代理主要工作于OSI模型的应用层(第七层)。
-
功能: 主要用来处理消息内容,关注于应用层协议和数据内容。七层代理能够深入到应用层,检查和操作传输的数据的具体内容,例如HTTP报文、URL、Cookie等。
-
负载均衡: 七层负载均衡器不仅能够基于IP地址和端口号进行负载均衡,还可以根据应用层的内容信息进行智能的负载均衡,例如基于URL、Cookie等。
-
性能: 由于需要深入到应用层处理,性能相对较低,但提供了更高层次的灵活性和智能负载均衡的能力。
四层代理
-
四层反向代理:四层就是传输层,tsp/ig协议进行代理转发。
-
只能实现基于ipg和端口的负载均衡,四层代理无法获取http请求的url信息。只是对数据包转发。流量分发。
七层代理
-
基于http协议的应用层代理,代理的是http的请求和响应
-
客户端访问代理服务器,代理服务器接收客户端的http请求,然后由代理服务器请求转发到内部的一组服务器上进行处理,
-
响应结果也由代理服务器返回给客户,在此过程中,客户端并不知晓自己访问的是代理服务器还是内部服务器,从而达到隐藏内部服务器的真实IP地址的目的
四层和七层的区别
工作层次:
-
四层代理: 工作在OSI模型的传输层(第四层)。它主要关注IP地址和端口号的信息,负责数据包的转发和传输。
-
七层代理: 工作在OSI模型的应用层(第七层)。它关注应用层协议和数据内容,能够深入到应用层处理传输的数据。
功能:
-
四层代理: 主要处理网络数据包的目标IP地址和端口号,不深入关注数据包的具体内容。只负责转发数据,不涉及应用层面的内容解析。
-
七层代理: 能够深入到应用层,检查和操作传输的数据的具体内容,例如HTTP报文、URL、Cookie等。提供更高级的功能,如内容过滤、应用层负载均衡等。
负载均衡:
-
四层代理: 主要基于IP地址和端口号进行负载均衡。只考虑网络数据包的目标信息。
-
七层代理: 不仅可以基于IP地址和端口号进行负载均衡,还可以根据应用层的内容信息进行智能的负载均衡,例如基于URL、Cookie等。
性能:
-
四层代理: 四层只是转发数据包,走的是内核态。不负责处理http请求,也不对数据包做任何处理,速度快。
-
七层代理: 对http的协议进行处理,走的是用户态,需要一系列的验证和处理流程,速度相对较慢。
应用场景:
-
四层代理: 适用于需要处理大并发连接请求的场景,只是针对tcp或者udp流量的转发。
-
七层代理: 适用于需要深度内容解析和智能负载均衡的场景,如Web应用负载均衡、内容过滤等。七层代理不适合高并发(硬件的条件可以一些场景的高并发),需要对http请求进行深入处理和控制的场景。
工作层次:
-
四层代理: 工作在OSI模型的传输层(第四层)。它主要关注IP地址和端口号的信息,负责数据包的转发和传输。
-
七层代理: 工作在OSI模型的应用层(第七层)。它关注应用层协议和数据内容,能够深入到应用层处理传输的数据。
功能:
-
四层代理: 主要处理网络数据包的目标IP地址和端口号,不深入关注数据包的具体内容。只负责转发数据,不涉及应用层面的内容解析。
-
七层代理: 能够深入到应用层,检查和操作传输的数据的具体内容,例如HTTP报文、URL、Cookie等。提供更高级的功能,如内容过滤、应用层负载均衡等。
负载均衡:
-
四层代理: 主要基于IP地址和端口号进行负载均衡。只考虑网络数据包的目标信息。
-
七层代理: 不仅可以基于IP地址和端口号进行负载均衡,还可以根据应用层的内容信息进行智能的负载均衡,例如基于URL、Cookie等。
性能:
-
四层代理: 四层只是转发数据包,走的是内核态。不负责处理http请求,也不对数据包做任何处理,速度快。
-
七层代理: 对http的协议进行处理,走的是用户态,需要一系列的验证和处理流程,速度相对较慢。
应用场景:
-
四层代理: 适用于需要处理大并发连接请求的场景,只是针对tcp或者udp流量的转发。
-
七层代理: 适用于需要深度内容解析和智能负载均衡的场景,如Web应用负载均衡、内容过滤等。七层代理不适合高并发(硬件的条件可以一些场景的高并发),需要对http请求进行深入处理和控制的场景。
反向代理的作用
-
负载均衡: 反向代理可以分发客户端的请求到多个后端服务器上,以平衡服务器负载。这有助于提高系统的性能、可用性和稳定性。
-
隐藏真实服务器: 反向代理可以隐藏后端服务器的真实地址和信息。客户端只与反向代理通信,而不直接与后端服务器建立连接,从而增加了系统的安全性。
-
缓存: 反向代理可以缓存后端服务器返回的内容,以提高相同请求的响应速度。这对于减轻服务器负载和加速内容传输非常有用。例如会话保持
-
安全性和访问控制: 反向代理可以实现安全功能,如身份验证、授权和防火墙规则。通过代理服务器,可以限制对后端服务器的直接访问,提高系统的安全性。
-
简化架构: 反向代理可以将复杂的后端服务器架构对外呈现为单个入口点,简化了客户端与服务器之间的通信和管理。代理服务器和几台后端服务器。就可以形成一个逻辑服务,这个服务架构可以随时的进行弹性伸缩。
反向代理如何实现以负载均衡的算法
七层的模块:upstream只能定义在http的全局模块之中。四层代理: stream只能定义在全局模块当中。
在Nginx中配置反向代理相对简单,以下是一个基本的配置示例:
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_server_ip:backend_server_port;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这个配置假设你有一个运行在 backend_server_ip:backend_server_port
地址和端口的后端服务器。下面是一些配置的解释:
-
listen 80;
: 监听端口80,这是HTTP的默认端口。 -
server_name your_domain.com;
: 将your_domain.com
替换为你的域名。
在 location /
块内:
-
proxy_pass http://backend_server_ip:backend_server_port;
: 指定反向代理的目标地址。 -
proxy_set_header
配置项: 设置一些HTTP头,将原始客户端的信息传递给后端服务器。这些头信息可以用于获取客户端真实IP地址等。
保存配置文件后,使用 nginx -t
来测试配置文件是否有语法错误,然后使用 systemctl restart nginx
重启Nginx以使配置生效。
请确保将上述配置中的占位符替换为实际的值,
负载均衡算法
轮询(Round Robin): 这是默认的负载均衡算法。每个请求按时间顺序逐一分配到不同的后端服务器,确保每个服务器都有机会处理请求。
upstream backend {
server backend1;
server backend2;
# 可以添加更多的后端服务器
# ...
}
server {
location / {
proxy_pass http://backend;
}
}
权重轮询(Weighted Round Robin): 为每个后端服务器分配一个权重值,权重值越高的服务器获得的请求越多。
upstream backend {
server backend1 weight=3;
server backend2 weight=2;
# ...
}
server {
location / {
proxy_pass http://backend;
}
}
最小连接数(Least Connections): 将请求发送到当前连接数最少的后端服务器。
upstream backend {
least_conn;
server backend1;
server backend2;
# ...
}
server {
location / {
proxy_pass http://backend;
}
}
IP哈希(IP Hash): 根据客户端的IP地址将请求分配到后端服务器,确保同一客户端的请求一直发送到同一台服务器,有助于保持某些会话状态。
upstream backend {
ip_hash;
server backend1;
server backend2;
# ...
}
server {
location / {
proxy_pass http://backend;
}
}
客户端的ip地址计算出一个hash,然后将请求发送到后端服务器,同一个客户端的请求会被分配到上一次转发的服务器。这就是nginx实现会话保持的方式。
URL HASH
根据客户端请求的URL计算一个HASH值,然后转发请求到后端服务器,如果每一次请求的url地址相同,都会分配到同一个服务器。请求地址发生变化,轮询的服务器也可能发生变化。
-
提取URL: Nginx从客户端请求中提取URL。
-
哈希计算: 使用一个哈希函数(如MD5、SHA-1、SHA-256等),将提取到的URL进行哈希计算,生成一个固定长度的哈希值。
-
映射到后端服务器: 将生成的哈希值映射到后端服务器列表的某个范围内。通常,这个映射是通过对哈希值取模运算来实现的,例如,如果有 N 台后端服务器,可以使用
hash_value % N
来决定将请求发送到哪个后端服务器。 -
请求转发: Nginx将请求转发到被确定的后端服务器。
这种方法的优点在于相同的 URL 总是被分发到相同的后端服务器,从而确保了在一些场景下的会话一致性和缓存效果。
在 Nginx 配置文件中,可以通过在
upstream
块中使用hash
指令来配置 URL HASH 算法。例如:
upstream backend {
hash $request_uri consistent;
server backend1;
server backend2;
server backend3;
}
上述配置中,$request_uri
是指使用请求的 URI(即URL)进行哈希计算,consistent
用于在后端服务器发生变化时尽可能地保持一致性。
在负载均衡算法中,七层都可以使用,四层只能用加权轮循以及最小连接数
stream要写在整个配置的全局当中,而且stream只能是ip+端口。