nginx------------缓存功能 (六)

一、http 协议反向代理

(一)反向代理示例:缓存功能

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

​
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配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,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 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_valid 200 302 10m;
 proxy_cache_valid 404 1m;
 
 
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] 
[purger_files=number] [purger_sleep=time] [purger_threshold=time];


#示例:在http配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
   
   
#调用缓存功能,需要定义在相应的配置段,如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
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

#示例
proxy_cache_use_stale error http_502 http_503;


proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

实验:

① 主配置文件的http模块中添加配置 
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;

 7-1代理服务器

[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

② 子配置文件添加配置

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;

去7-3配置拖入图片:

③ 去浏览器访问代理端:

去7-1代理服务器查看缓存

如果把真实服务器关掉

再去浏览器访问,还是可以访问到的,这就是缓存用处哦

(1)如何清理nginx代理服务器缓存

方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

(2)自定义添加响应报文头部信息

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

小插曲:虚拟机要在主配置文件夹写子配置,子配置才可用

实验1:自定义添加响应报文头部信息

add_header X-Via     $server_addr;             #当前nginx主机ip

add_header X-Cache $upstream_cache_status;   #是否缓存命中,hit命中,miss未命中add_header X-Accel   $server_name;             #客户端访问的FQDN

add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
server {
        listen 80;
        server_name www.lucky.com;
        root /data/;
        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;
        add_header X-Via     $server_addr;
        add_header X-Cache $upstream_cache_status;
        add_header X-Accel   $server_name;
        add_header  cxk  hero;
        location ~* /api {
        proxy_pass http://192.168.246.8;
        }
        location ~* \.(jpg|jpeg|png|gif|bmp)$ {
        proxy_pass http://192.168.246.9;
        }
}
① 添加子配置文件

 查看新增头部字段信息

(二)实现反向代理客户端 IP 透传

IP透传的定义:Client客户端通过http服务访问192.168.246.7的代理服务器,代理服务器通过proxy跳转至192.168.246.8后端真实服务器,最后在Web后端真实服务器应该可以看到真实客户端的访问IP和代理服务器的IP。

实验1:IP透传-------单向透传     7-1用nginx    7-2用apache

①在代理服务器7-1写配置文件:
server{ 
        listen 80;       
        root /data/;
       server_name www.lucky.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.246.8;
       }
}

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

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部
②在后端服务器(真实服务器)配置:开启httpd服务,关闭防火墙,并实时查看访问日志

解释:

③ 客户端7-3访问代理服务器

我们使用第三台机器作为客户端,通过代理服务器去访问后端真实服务器 

再去查看日志:

显示了真实的访问主机的ip地址,开启ip透传后可以查看到客户端ip

实验2:IP透传----------多级代理     三台主机均为nginx服务

①去7-1代理服务器配置:
server{
        listen 80;
        root /data/;
       server_name www.lucky.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.246.8;
       }
}

​​​​​​​

②去7-2代理服务器配置:
[root@zzzcentos2 ~]#systemctl stop httpd
[root@zzzcentos2 ~]#yum install  epel-release -y
[root@zzzcentos2 ~]#yum install nginx -y
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#systemctl stop firewalld
[root@zzzcentos2 ~]#setenforce 0
[root@zzzcentos2 ~]#systemctl stop httpd
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#vim /etc/nginx/nginx.conf
[root@zzzcentos2 ~]#nginx -s reload
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

#添加客户端IP和反向代理服务器IP到请求报文头部

③ 后端服务器7-3新建web文件
[root@zzzcentos3 html]#cd /usr/share/nginx/html
[root@zzzcentos3 html]#echo welcome 7-3 > index.html
[root@zzzcentos3 html]#cat index.html
welcome 7-3

④检测:

⑤查看日志

(三)http反向代理负载均衡

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

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

配置格式:

#自定义一组服务器,配置在http块内
upstream   web { 
 server 192.168.91.100    调度算法
 server 192.168.91.101
}

location  / {
pass_proxy  http://web/
}
官方文档: https://nginx.org/en/docs/http/ngx_http_up
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

实验拓朴草图

我们做实验,为了看到效果,所以内容不一样

真实环境中,内容是一样的

[root@zzzcentos3 ~]#systemctl stop nginx
[root@zzzcentos3 ~]#systemctl start httpd
[root@zzzcentos3 ~]#cd /var/www/html/
[root@zzzcentos3 html]#echo welcome to 7-3 > index.html
[root@zzzcentos3 html]#cat index.html
welcome to 7-3

调度算法 :

①实验:轮询算法 (一人一次)   

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

7-1代理服务器编辑主配置文件

检测:

如果有一天服务器宕机或者挂了

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

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

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

② 加权轮询算法

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

下回分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/415876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Tomcat] 控制台日志乱码,快速解决

启动tomcat之后,控制台打印的日志中出现了中文乱码的情况 解决方法 找到tomcat下的conf目录下的logging.properties文件,地址一般为:C:\apache-tomcat-9.0.17\conf 将logging.properties打开,将java.util.logging.ConsoleHandler…

向量数据库PGVECTOR,AI浪潮下崛起的新秀!

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

Javaweb day7

Ajax 写法 (比较落后) 简化版:AXIOS 写法 简化 案例: 基础代码 写法

项目流程图

实现便利店自助付款项目 服务器: 1、并发服务器(多进程、多线程、IO多路复用) 2、SQL数据库的创建和使用(增删改查) 3、以模块化编写项目代码,按照不同模块编写.h/.c文件 客户端: 1、QT客户端界…

AI智能电销机器人效果怎么样?呼叫部署

我们的生活早已变得无处不智能,从智能手机到无人车、虚拟VR到智能家居,你迎接的每一个清晨、享受的每一个夜晚,可能都离不开智能设备的服务。 工作中,智能化产业也正在影响着企业,电销机器人正在帮助各大企业获得更高的…

input css padding

这样控件会跑出外套控件在HTML JSP里面是经常出现的。但有些外国adobe的as控件不存在这种情况,这是因为内层控件定义的时候不能超出外层控件的范围。 修改下:去掉原来css padding,然后加上宽度和高度

Win UI3开发笔记(四)设置主题续

上文讲到过关于界面和标题栏以及普通文本的主题设置,这篇说一下关于对话框的主题设置。 我最终没找到办法,寻求办法的朋友可以不用接着看了,以下只是过程。 一个对话框包括标题部分、内容部分和按钮部分,其中,在Cont…

windows IIS 申请和配置https(SSL)的工具 win-acme

win-acme 是一个为Windows平台设计的工具,用于从Lets Encrypt自动获取和续期SSL/TLS证书,特别适合用于IIS(Internet Information Services)服务器。它的使用相对简单,提供了一个用户友好的命令行界面,以及一…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示,用户网络 1 通过 LSW1 与 Switch 相连, Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连, Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数,对 VLAN2 进…

解决鸿蒙模拟器卡顿的问题

缘起 最近在学习鸿蒙的时候,发现模拟器非常卡,不要说体验到鸿蒙的丝滑,甚至到严重影响使用的程度。 根据我开发Android的经验和在论坛翻了一圈,最终总结出了以下几个方案。 创建模拟器 1、在DevEco Virtual Device Configurat…

工业锅炉物联网:HiWoo Cloud为工业能源转型注入新动力

随着全球工业化的快速发展,工业锅炉作为工业生产的“心脏”,其能源效率和运行安全性越来越受到关注。然而,传统的工业锅炉管理往往依赖于人工监控和定期维护,这种方式不仅效率低下,而且难以确保设备的持续高效运行。在…

物联网通信协议介绍

为了方便,将物联网通信协议分为两大类,一类是接入协议,一类是通讯协议。接入协议一般负责子网内设备间的组网及通信;通讯协议主要是运行在传统互联网TCP/IP协议之上的设备通讯协议,负责设备通过互联网进行数据交换及通…

PDF Expert for Mac v3.9.2中文激活版下载

PDF Expert for Mac是一款易于使用的 PDF 编辑器和注释器,专为 Mac 设备设计。它允许用户轻松查看、编辑、签名、注释和共享 PDF。该软件使用户能够向他们的 PDF 添加文本、图像、链接和形状,突出显示和标记文本,填写表格以及签署数字文档。它…

WebServer -- 日志系统(下)

目录 🌼整体思路 🎂基础API fputs 可变参数宏 __VA_ARGS__ fflush 🚩流程图与日志类定义 流程图 日志类定义 🌼功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 🌼整体思路 日志系统分两部…

追踪Jira中项目成本与工时,更符合国人使用习惯——TimeWise工时管理

近日,龙智联合Atlassian举办的DevSecOps研讨会年终专场“趋势展望与实战探讨:如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队,以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0…

ABAP - OOALV 双击事件

OOALV的双击事件通过cl_gui_alv_grid内置事件double_click实现,效果如下图显示 实现步骤:不需要像单击事件那样需要热点 定义一个事件处理类及其操作处理 CLASS cl_event DEFINITION.PUBLIC SECTION.METHODS handle_double_click FOR EVENT double_clickOF cl_gui…

MyBatis-Plus 快速入门

介绍 j​​​​​MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网:MyBatis-Plus (baomidou.com) 1.…

UE5 UE4 不同关卡使用Sequence动画

参考自:关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列,包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡,Sequence无法在新关卡中找到相同的Actor,导致报错。 Sequen…

成人年龄判断(个人学习笔记黑马学习)

结合前面学习的input输入语句,完成如下案例: 1.通过input语句,获取键盘输入,为变量age赋值。(注意转换成数字类型) 2.通过if判断是否是成年人,满足条件则输出提示信息,如下: 欢迎来到黑马儿童游乐场&#x…

上拉电阻与下拉电阻、电容的作用

上拉电阻与下拉电阻 在单片机电路中,上拉电阻和下拉电阻都是常见的电路元件,它们在数字电路设计中扮演着重要的角色。它们的作用如下: 1. **上拉电阻**: - **作用**:当一个引脚没有外部信号时,上拉电阻…