Nginx缓存服务

news/2024/11/15 23:29:02/文章来源:https://www.cnblogs.com/zgw03/p/18378192

Nginx缓存服务

7.1 缓存配置语法

proxy_cache 配置语法

S

yntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location//缓存路径
Syntax: proxy_cache_path path [levels=levels]
[use_temp_path=on|off] keys_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];
Default: —
Context: http缓存过期周期Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
//示例
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;code :返回的 HTTP 状态码,如200(成功), 404(未找到)等,也可以⽤ any 表示任何状态码。
time :缓存的有效时间,可以使⽤以下格式:
秒数。例如: proxy_cache_valid 200 60s; 表示 对状态码为200的请求进⾏缓存,有效时间为60秒。
分钟数。例如: proxy_cache_valid 200 5m; 表示 对状态码为200的请求进⾏缓存,有效时间为5分钟。
⼩时数。例如: proxy_cache_valid 200 2h; 表示 对状态码为200的请求进⾏缓存,有效时间为2⼩时。
天数。例如: proxy_cache_valid 200 1d; 表示 对状态码为200的请求进⾏缓存,有效时间为1天。
多个时间。例如: proxy_cache_valid 200 3h 5m; 表示 对状态码为200的请求进⾏缓存,有效时间为3⼩时5分钟。
可以在 server、 location 等上下⽂中使⽤该指令。在 location 上下⽂中使⽤时,可以设置三种不同状态码的缓时间:1xx, 2xx, 3xx: syntax: proxy_cache_valid [code] time1 [time2];
4xx, 5xx: syntax: proxy_cache_valid [code] time;
any :表示任意状态码。
缓存的维度Syntax: proxy_cache_key stryuan;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
//示例
proxy_cache_key "$host$request_uri $cookie_user";
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_key $host$uri$is_args$argsproxy_cache_key 是 Nginx 中⽤于设置缓存 Key 的指令,可以⽤来控制哪些请求会被缓存以及如何组成缓存
Key。⽽ $host$uri$is_args$args 是⼀种 Nginx 内置的变量,它们分别表示请求的 Host、 URI、是否带有 ?
以及请求参数。因此, proxy_cache_key 
uri
args 这条指令表示使⽤ $host 、 $uri 、 $is_args 和
$args 四个变量作为⽣成缓存 Key 的基础,并按照这个顺序组合成⼀个字符串,作为具体的缓存 Key。这样,同
⼀请求的不同参数就会⽣成不同的缓存 Key,从⽽保证缓存的准确性和有效性。注意的是, proxy_cache_key 的设置应该根据具体业务场景进⾏调整,以达到最佳的缓存效果。在⼀些没
有参数的静态资源请求中,可以只使⽤ $host$uri 作为缓存 Key,⽽在有参数或者情况较为复杂的请求
中,需要使⽤更多的变量来⽣成缓存 Key。

7.2 缓存配置实践 √

1.缓存准备

系统 服务 地址
CentOS7.4 Nginx Proxy Cache 代理cache服务器 10.1.106.70
CentOS7.4 Nginx Web 后端 192.168.1.152
2.web节点准备

192.168.1.152

//建⽴相关⽬录
[root@nginx ~]# mkdir -p /soft/code{1..3}
//建⽴相关html⽂件
[root@nginx ~]# for i in {1..3};do echo Code1-Url$i > /soft/code1/url$i.html;done
[root@nginx ~]# for i in {1..3};do echo Code2-Url$i > /soft/code2/url$i.html;done
[root@nginx ~]# for i in {1..3};do echo Code3-Url$i > /soft/code3/url$i.html;done

//配置Nginx

[root@nginx ~]# cat /etc/nginx/conf.d/server.conf
server {
listen 8081;
root /soft/code1;
index index.html;
}
server {
listen 8082;
root /soft/code2;
index index.html;
}
server {
listen 8083;
root /soft/code3;
index index.html;
}

//检查监听端⼝

[root@nginx ~]# netstat -lntp|grep 80
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN
50922/nginx: master
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN
50922/nginx: master
tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN
50922/nginx: master

2.代理配置缓存

10.1.106.70

[root@proxy ~]# mkdir /soft/cache
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_cache.conf
upstream cache {
server 192.168.1.152:8081;
server 192.168.1.152:8082;
server 192.168.1.152:8083;
}

proxy_cache存放缓存临时⽂件

levels 按照两层⽬录分级

keys_zone 开辟空间名, 10m:开辟空间⼤⼩, 1m可存放8000key

max_size 控制最⼤⼤⼩, 超过后Nginx会启⽤淘汰规则

inactive 60分钟没有被访问缓存会被清理

use_temp_path 临时⽂件, 会影响性能, 建议关闭

proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
listen 80;
server_name cache.yuansredevsecops.top;

proxy_cache 开启缓存

proxy_cache_valid 状态码200|304的过期为12h, 其余状态码10分钟过期

proxy_cache_key 缓存key

add_header 增加头信息, 观察客户端respoce是否命中

proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台

location / {
proxy_pass http://cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}
}

3.客户端测试

7.4 缓存清理实践 √

Nginx缓存及使⽤ngx_cache_purge进⾏缓存清除 :https://www.jianshu.com/p/1a89ab25ea78如何清理 proxy_cache 代理缓存rm删除已缓存数据
[root@proxy ~]# rm -rf /soft/cache/*
[root@proxy ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html |grep "Nginx-Cache"
Nginx-Cache: MISS通过 ngx_cache_purge扩展模块清理, 需要编译安装 Nginx
//建⽴对应⽬录
[root@proxy ~]# mkdir /soft/src
[root@proxy ~]# cd /soft/src//下载Nginx包
[root@proxy ~]# wget http://nginx.org/download/nginx-1.21.0.tar.gz
[root@proxy ~]# tar xf nginx-1.21.0.tar.gz//下载ngx_cache_purge
[root@proxy ~]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
[root@proxy ~]# tar -zxvf 2.3.tar.gz//编译Nginx
[root@nginx src]# cd nginx-1.21.0/ && ./configure --prefix=/etc/softwares/nginx \
--with-http_stub_status_module \
--with-http_ssl_module --with-stream \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-pcre \
--add-module=/soft/src/ngx_cache_purge-2.3 
[root@nginx src]# make && make install//需要将上⽂的缓存proxy_cache.conf⽂件拷⻉⾄源码包中
[root@linuxprobe conf]# pwd
/etc/softwares/nginx/conf
[root@linuxprobe conf]# cp /etc/nginx/conf.d/proxy_cache.conf ./
//并增加如下内容
[root@linuxprobe conf]# vim proxy_cache.conf
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
proxy_cache_purge code_cache $host$1$is_args$args;
}//检测配置重新加载
[root@nginx conf.d]# /etc/softwares/nginx/sbin/nginx -t
[root@nginx conf.d]# /etc/softwares/nginx/sbin/nginx -s reload使⽤浏览器访问建⽴缓存1685168215822通过 purge 请求对应的缓存数据,自动清理缓存1685168250223再次刷新就会 404 因为缓存内容已清理1685168264496#若访问失败则检查nginx.conf配置文件并授权
[root@linuxprobe logs]# cat /etc/softwares/nginx/conf/nginx.conf
worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include ./conf.d/*.conf;
}
[root@linuxprobe logs]# chmod 777 -R /soft/cache/
#检查配置文件存放位置,必须在conf.d文件夹下
[root@linuxprobe conf.d]# ls
proxy_cache.conf
[root@linuxprobe conf.d]# pwd
/etc/softwares/nginx/conf/conf.d
[root@linuxprobe logs]# mkdir -p conf.d

7.5 部分页面不缓存 √

指定部分⻚⾯不进⾏ proxy_Cache 缓存

cat proxy_cache.conf
upstream cache{
server 192.168.1.152:8081;
server

 192.168.1.152:8082;
server 192.168.1.152:8083;
}proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;server {
listen 80;
server_name cache.yuansredevsecops.top;
#选择清理url3缓存
if ($request_uri ~ ^/(url3|login|register|password)) {
set $cookie_nocache 1;
}location / {
proxy_pass http://cache;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pargma $http_authorization;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}}//清理缓存
[root@nginx ~]# rm -rf /soft/cache/*//请求测试
[root@nginx ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS

7.6 缓存日志记录统计 √

通过⽇志记录 proxy_cache 命中情况与对应 url//修改/etc/nginx/nginx.conf中log_format格式
log_format main '$http_user_agent' '$request_uri' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"';
//修改proxy_cache.conf, 在server标签新增access⽇志
access_log /var/log/nginx/proxy_cache.log main;

//使⽤curl访问, 最后检查⽇志命令情况

[root@linuxprobe ~]#  curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@linuxprobe ~]#  curl -s -I http://cache.yuansredevsecops.top/url1.html|grep "Nginx-Cache"
Nginx-Cache: HIT
[root@linuxprobe ~]# tailf /var/log/nginx/proxy_cache.log
curl/7.29.0/url3.html192.168.1.170 - - [31/May/2023:16:39:20 +0800] "HEAD /url3.html HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""MISS"
curl/7.29.0/url1.html192.168.1.170 - - [31/May/2023:16:39:25 +0800] "HEAD /url1.html HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT"

image-20240824200843379

image-20240824201053392

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八周进度报告

常用API SimpleDateFormat格式化:把时间变成我们喜欢的格式 解析:把字符串表示的时间变成Date对象import java.text.SimpleDateFormat; import java.util.Date;public static void main(String[] args) throws ParseException {/*public SimpleDateFormat() //默认格式publi…

学习Java的第八周

随着24年暑假的结束,第八周的Java学习也结束了,本周主要学习了字符串,包括API简介(提供各种功能的可以直接使用的类),字符串的概述、构造实现(创建String对象的两种方式,它们的不同点)、内存分析(两种定义方式各自的内存原理)、字符串比较方法(equals和equalsIgnor…

XGBoost中正则化的9个超参数

正则化是一种强大的技术,通过防止过拟合来提高模型性能。本文将探索各种XGBoost中的正则化方法及其优势。为什么正则化在XGBoost中很重要? XGBoost是一种以其在各种机器学习任务中的效率和性能而闻名的强大算法。像任何其他复杂模型一样,它可能会过拟合,特别是在处理噪声数据或…

FPGA基础:格雷码及FIFO应用概述

1简介 反射二进制码反射二进制码(RBC),也称为反射二进制(RB)或格雷码(Gray code),得名于Frank Gray,是二进制数制的一种排列方式,使得连续两个值之间仅有一个比特(二进制位)不同。格雷码在数字电路中的应用有助于减少误差、提高系统的可靠性,并简化逻辑操作,因此…

[操作系统]访问一个逻辑地址发生了什么

当CPU想要访问一个逻辑地址的时候,我们需要做两个步骤,地址转换和内存访问 地址转换 逻辑地址是程序内部使用的地址,并非真正的物理地址。 从逻辑地址到物理地址的映射,由页表来完成,页表的内容包括,逻辑页号,物理页号,有效位,有效位表示这一页是否在内存中。 页表存放…

[Ynoi2011] 初始化

题目链接 : [Ynoi2011] 初始化 神仙trick + 卡常题,前缀后缀和根本没听过。 根号分治 + 分块。 对于修改操作,发现是跳着修改,考虑根号分治。若\(x \ge \sqrt{n}\),直接暴力更改,复杂度\(O(\sqrt{n})\)。 反之,可以将序列抽象成一堆大小为\(x\)的段,如图,\(l,r\)是查询…

windows Tauri 构建(Release)时下载 WiX等其它打包文件失败

方法 手动下载放到指定的目录 参考这幅图:注意:随着版本的更新上面的方法存在一个小问题,需要把文件夹名字改一下,WixTools改成WixTools314参考 https://github.com/tauri-apps/tauri/issues/7338

【微信小程序开发】栀子手作花花微信小程序商城开发最佳实践

本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。一、功能演示 首页:包含了商品介绍,领劵中心和商品列表区域。 商品…

《Programming from the Ground Up》阅读笔记:p103-p116

《Programming from the Ground Up》学习第7天,p103-p116总结,总计14页。 一、技术总结 1.读写文件 (1)linux.s linux.s: #file name:linux.s# system call numbers(按数字大小排列,方便查看) .equ SYS_READ, 0 .equ SYS_WRITE, 1 .equ SYS_OPEN, 2 .equ SYS_CLOSE, 3 .equ …

控件与布局

1.控件的分类:主要要6大类一.布局控件:可以容纳多个控件或者嵌套其他布局控件,用于在UI上组织和排列控件。Grid、StackPanel、DockPanel等都属于此类,他们拥有共同的父类Panel二.内容控件:只能容纳一个其他控件或者布局控件作为他的内容。Window、Button等都属于此类,因为…

第7篇:在虚拟机 centos7上搭建jira管理工具

本文详细介绍了如何在CentOS7系统上下载配置Jira,包括创建文件夹、下载安装包、解压、修改配置文件以及设置JVM和MySQL环境。同时,文章还涉及了JDK1.8的安装,数据库的创建,以及Jira的破解步骤,包括替换特定jar文件和配置数据库连接。最后,文章提到了启动Jira服务并进行汉…

最近遇到的一些奇奇怪怪奇技淫巧

然后我CF上绿了————DaisySunchaser要多思考。构造——从哪里入手?CF交互指南要多注意。 我的最初想法:当我查看了他使用了冰茶几的代码: #include<bits/stdc++.h> #define ll long long #define N 200005 #define mp make_pair using namespace std; int T,n,u[N]…