nginx反向代理及负载均衡

2,331 阅读5分钟

反向代理

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

  1. 工作原理

    • 代理服务器接受客户端的网络访问连接请求。
    • 代理服务器根据配置的策略将请求转发给网络中实际工作的业务服务器。
    • 业务服务器处理请求并返回结果给代理服务器。
    • 代理服务器将结果返回给网络上发起连接请求的客户端。

Screenshot 2024-06-05 215409.png

proxy_pass; 
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
例子、
location / {
proxy_pass http://192.168.100.102;
}
#   http://192.168.91.101   目前加不加/ 无所谓    访问本机的主站点  那么跳转到  101 的 主站点 
location   /test {
proxy_pass http://192.168.100.102;    
}

地址后面加不加/的区别

加 /相当于重写 意思是让问这个代理服务器的/test 时,将url重写为 http://192.168.100.102/ 访问的就是102下的根目录 image.png

image.png

不加 / 相当于追加将location后面url 附加到proxy_pass指定的url后面

proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器 http://192.168.100.102/test/index.html 即后端服务器配置的站点根目录要有test目录才可以被访问

image.png 如果location定义其uri时使用了正则表达式模式(包括~,*,但不包括^),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后

server {
 ...
 server_name HOSTNAME;
 location ~|~* /uri/ {
 proxy_pass http://host:port; #proxy_pass后面的url 不能加/
 }
 ...
 }
 
 
# http://HOSTNAME/uri/ --> http://host/uri/

其他设置

proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启


proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
实战案例:指定location 实现反向代理 动静分离

它主要是将动态请求和静态请求分开处理,从而提高Web服务器的性能和响应速度。动态请求通常是由后端服务器(如PHP、Node.js、Python等)处理,而静态请求(如HTML、CSS、JavaScript、图片等)则可以直接由Nginx服务器处理。

代理服务器 192.168.100.254 动态服务器 192.168.100.102 静态服务器 192.168.100.101

配置代理服务器规则 当uri为/api时 将uri转为 http://192.168.100.101/api

当uri以php或png等结尾时 将uri转为 http://192.168.100.102/php

image.png

image.png

image.png

负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能 image.png

自定义一组服务器,配置在http块内
upstream  web { 
 server 192.168.91.100    
 server 192.168.91.101
 server 192.168.91.102
}

上游服务器
真实服务器


location  / {
pass_proxy  http://web/
}


nginx    配置




#示例
upstream backend {
   使用什么算法
   server backend1.example.com weight=4;     权重
   server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;
   server unix:/tmp/backend3;
   server backup1.example.com backup;
}


语法

server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。

#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
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计算,使consistent参数,将使用ketama一致性


www.kgc.com/test1   

hash  test1      103  


hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一
致性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid  #基于cookie中的sessionid这个key进行hash调度,实现会话绑定




ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持


least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC


fair
#此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。