nginx反向代理之缓存 客户端IP透传 负载均衡

这篇具有很好参考价值的文章主要介绍了nginx反向代理之缓存 客户端IP透传 负载均衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 缓存功能

缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。

相关选项:

​
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
 
proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
 
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
 
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
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
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

实验:为代理服务器开启缓存功能

① 代理服务器主配置文件的http模块中添加配置

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf   #主配置文件
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
#开启缓存         缓存路径              生成文件夹比例是3级  从内存中借调20M专门存放缓存  有效期120秒    最大存储空间为1g
[root@localhost ~]# mkdir /data/nginx/
[root@localhost ~]# nginx -t 


注意:路径不存在或者错误

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

② 子配置文件添加配置


[root@mcb-11-9 nginx]#vim /apps/nginx/conf.d/pc.conf 
[root@mcb-11-9 nginx]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@mcb-11-9 nginx]#nginx -s reload
[root@mcb-11-9 nginx]#ls /data/nginx/
proyxcache
[root@mcb-11-9 nginx]#rpm -q tree
未安装软件包 tree 
[root@mcb-11-9 nginx]#yum install tree -y

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

proxy_cache proxycache;
        proxy_cache_key $request_uri;
        #proxy_cache_key $host$uri$is_args$args;
        proxy_cache_valid 200 302 301 10m;
        proxy_cache_valid any 5m;

③是否有缓存

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

在另一台配置拖入图片

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

浏览器检测

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

去代理服务器查看缓存

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

只能保留,不能强刷否则,图片小时 

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

①如何清理nginx代理服务器缓存

方法1  rm -rf 缓存目录

方法2: 第三方扩展模块ngx_cache_purge

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

②自定义添加响应报文头部信息

基于可以实现对后端服务器响应给客户端的报文中添加指定的响应首部字段

Syntax: add_header name value [always];
Default;
Context: http,server,location,if in location
 
#添加响应报文的自定义首部:
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;  #客户访问的FQDN
 
 
add_header X-Via   
add_header X-Cache 
add_header X-Accel



# systemctl start httpd.service 



[root@mcb-11-9 html]#nginx -s reload
[root@mcb-11-9 html]#vim /apps/nginx/conf.d/pc.conf
[root@mcb-11-9 html]#systemctl start nginx
[root@mcb-11-9 html]#cat /apps/nginx/conf.d/pc.conf

①添加子配置文件 

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

② 查看新增头部字段信息 

[root@mcb11-3 html]# systemctl stop httpd.service 

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

二 客户端ip透传

一级代理

在Nginx中,代理客户端IP透传是指将客户端的真实IP地址(也称为远程IP地址)传递给后端服务器。这在一些情况下非常有用,例如,当Nginx作为反向代理服务器时,我们希望后端服务器能够获取到客户端的真实IP地址,而不是Nginx服务器的IP地址。

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

ip透视-------单向透视 11.9代表代理  11.8代表apache (此实验还需要在做一次)

在代理服务器7-1写配置文件

server{ 
        listen 80;       
        root /data/;
       server_name www.mcb.com;
       add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       location  / {
       proxy_pass http://192.168.11.8;
       }
}

当前访问192.168.11.9代理服务器跳转的是192.168.11.8后端真实服务器

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

② 添加后端服务器11.8web文件,开启httpd服务,关闭防火墙,并实时查看访问日志

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

客户端(11.3)访问代理服务器

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

④ 观察后端服务器11.8新增日志信息

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

实验:ip透视 -------多级代理(三台主机均为nginx服务)

二级代理

实现目标:7-0服务器日志可以查看到客户端ip和反向代理服务器ip。

二 负载均衡策略

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器,但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,

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

官方文档: https://nginx.org/en/docs/http/ngx_http_up

配置格式

#自定义一组服务器,配置在http块内
http {
    upstream   web { 
    server 192.168.11.4   调度算法
    server 192.168.11.7
    }
  
    location  / {
    pass_proxy  http://web/
    }
}

上面的配置中,upstream块定义了后端服务器的列表和负载均衡算法。server块定义了反向代理服务器的监听端口和域名,以及请求转发的配置。具体说明如下:

  • upstream块:定义了一个名为web的负载均衡服务器组,其中包含了三个后端服务器,分别是192.168.190.100、192.168.190.101、192.168.190.102。
  • weight=5:表示将第一个后端服务器的权重设置为5,即分配更多的请求给它。ip_hash表示使用IP哈希算法进行负载均衡。keepalive 32表示使用长连接并保持32个连接。 
  • server块:定义了一个监听80端口的虚拟主机,它的域名是www.pc.com。location /表示将所有请求转发给upstream块中定义的服务器组web。proxy_set_header指令可以设置请求头,以便后端服务器能够获取客户端的真实IP地址等信息。
  • 由于使用了least_conn;算法,Nginx会动态地将请求发送到当前连接数最少的后端服务器上,以达到负载均衡的目的。
  • upstream块中使用了ip_hash算法,表示会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。
  • 由于使用了fair算法,请求会被发送到响应时间最短的服务器上,从而实现负载均衡。
Nginx负载均衡配置状态参数:



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一致性
 
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

NFS:网络文件系统,用来存储内容

nginx反向代理之缓存 客户端IP透传 负载均衡,nginx,缓存,负载均衡

负载均衡

①后端(两个)服务器开启httpd(apache),关闭防火墙 防护 或iptables

1 调度算法 

默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流提供响应

http {
 upstream web {
       server 192.168.190.100:80;
       server 192.168.190.101:80;
}

①轮询算法(一人一次)

默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流提供响应。

①代理服务器配置主文件

②apache后端服务器开启httpd服务,关闭防火墙,分别建立web文件

检测

若买一台服务器宕机?

那么只会跳转好的那一台服务器

当其中一台宕机,就不去访问他了,直接跳过

那是因为 nginx 有 健康性检测 机制 就不去坏的服务器了

nginx服务较为只能,通过tcp三次握手可以检查服务器健康性,当无法完成连通性,默认将不会访问从而提示报错。当故障服务器恢复正常后,再次轮巡调度。

② 加权轮询算法

在默认轮询的基础上增加权重,weight=number。如果后端有2个服务器其中一个配置权重为weight=5另外一个不配置默认是1,则有用户访问时分配给给有权重的服务器和不配置权重的服务器的比例为5:1。

①配置代理服务器文件

检测 :客户机访问代理服务器

③ 最小连接数算法

最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC。按照nginx反向代理服务器和后端服务器的连接数分配请求,连接越少的分配处理请求优先级越高。例如最小连接数(least_conn;)是设置是3,1号后端服务器有2个请求在处理,而后2号后端服务器只有1个请求在处理,则新请求交给后端服务器2。

 20     upstream web {
 21     server 192.168.11.8;
 22     server 192.168.11.9 max_conns=10 max_fails=3 fail_timeout=30s;
 23     }
#max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
#max_fails=number   后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
#fail_timeout=time 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒。这样避免服务器刚上线不稳定再次导致业务失败
④备份服务器

当所有后端服务器不可用时,才会启用此备用服务器sorry server,自己不能转自己。

2 ip调度操作

(1) ip_hash算法

基于客户端IP地址的负载均衡算法。它会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。这样可以保证同一个客户端的所有请求都被发送到同一个后端服务器,从而保证了会话的一致性。

upstream web {
    hash $remote_addr;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端访问

hash算法会将Web页面访问的缓存定在某一个代理服务器;但是hash算法有一个缺点就是hash还要除以权重,下次重载配置会更换Web服务的代理服务器

(2) url hash
 20     upstream web { 
 21     hash $request_uri;         #发送请求的地址,一旦确定不会轻易改变
 22     server 192.168.246.8;
 23     server 192.168.246.9;
 24     }

① 修改代理服务器配置

② 客户端访问

(3)cookie  
upstream web {
   hash $cookie_hello;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端模拟加上cookie访问

(4) fair算法

基于后端服务器的负载均衡算法。它会根据后端服务器的响应时间,将请求发送到响应时间最短的服务器上。这样可以保证请求被发送到处理能力最强的服务器上,从而提高系统的性能。

(5)least_conn
upstream web_test { 
      least_conn;  --把请求转发给连接数较少的后端服务器
      server 10.10.2.100:80; weight=1;
      server 10.10.3.100:80; weight=2;
}

三 stream 服务模块

http://nginx.org/en/docs/stream/ngx_stream_core_module_html

stream  实现反向代理功能, 是四层模块,只能控制tcp、udp

(实现反向代理功能,包括TCP协议代理); stream和http模块是同级

四层代理和七层代理的区别:

4层是指传输层的 TCP/UDP 协议

7层是指应用层的 HTTP 协议

代理原理:

     4层代理:使用 NAT(Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx 只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给 nginx,nginx 数据包再做一次类似的修改,就返回给请求的客户端了。
     7层代理:nginx 读取并解析 Http 请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。文章来源地址https://www.toymoban.com/news/detail-840257.html

到了这里,关于nginx反向代理之缓存 客户端IP透传 负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nginx获取客户端真实ip

    在nginx中获取客户端真实IP的方法有多种,以下是其中两种常用的方法: 使用nginx的access_log模块记录请求日志,并在日志中包含客户端的真实IP信息。例如: 在上述配置中,通过使用http_x_forwarded_for字段来获取客户端的真实IP地址。如果该字段不存在或不合法,则使用remote_ad

    2024年02月16日
    浏览(38)
  • nginx 获取客户端真实IP

    网站接入Web应用防火墙WAF(Web Application Firewall)后,访问请求在到达源站服务器之前,需要经过WAF的代理转发。这种情况下,源站服务器可以通过解析回源请求中的X-Forwarded-For记录,获取客户端的真实IP。 WAF在将客户端的访问请求转发到下一环节的服务器时,会在HTTP的请求头

    2023年04月09日
    浏览(37)
  • Nginx(二十) 获取真实客户端IP

            客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用以实现真实客户端

    2024年01月16日
    浏览(34)
  • nginx如何获取真实客户端ip

    nginx作为反向代理服务器,即代理我们的服务端,下面介绍下如何配置nginx获取真实的客户端ip 1、配置nginx.con 2、在java程序中可以通过如下方式获取: 这样就可以打印出真实ip了!即request.getHeader(\\\"X-Real-IP\\\")的值 引用: 查看端口占用及释放所占用的端口_查询谷歌浏览器的端口

    2024年02月11日
    浏览(40)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(26)
  • Nginx+netty实现tcp负载均衡,获取客户端真实ip

    在nginx.conf文件中,events,http同级添加配置 启动nginx服务 启动2个服务netty服务设置nginx中8888,8889端口。 使用tcp工具连接并发送数据测试 参考博客 参考链接1 参考链接2

    2024年02月06日
    浏览(40)
  • 第13关 解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 这节课带大家探索并分享最全面的解决在使用Kubernetes(K8s)和Ingress-Nginx-Controller中无法获取客户端真实IP问题的视频教程,帮助你快速理解并解决这一问题。 如果我们按下面网络架构图,暴露我们服务到公

    2024年02月03日
    浏览(37)
  • 【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞

    上面突然说,需要检查Nginx反向代理的安全问题并给出了修改方法,小白的我一脸懵逼,明明都是中文,连在一起咋就看不明白了。于是乎,对着修改内容简单学习了一下,在此做个记录,如有问题请大佬们指点指点。 在Nginx中的location里,我们通常会配置proxy_set_header,如下

    2024年02月19日
    浏览(30)
  • 分布式软件架构——客户端缓存

    当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了。在 HTTP 协议设计之初,人们便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求客户端的每次请求是独立的,每次请求无法感知、也不能依赖另一个请求的存在,这既简化了 HTTP 服务器的

    2024年02月12日
    浏览(30)
  • nginx-反向代理缓存

    反向代理缓存相当于自动化动静分离。 将上游服务器的资源缓存到nginx本地,当下次再有相同的资源请求时,直接讲nginx缓存的资源返回给客户端。 本地缓存资源有一个过期时间,当超过过期时间,则重新向上游服务器重新请求获取资源。 这样减轻了上游服务器的资源请求负

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包