Nginx反向代理与负载均衡

发布于:2024-06-11 ⋅ 阅读:(32) ⋅ 点赞:(0)


一、反向代理

反向代理: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个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
   proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
   proxy_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;
}