009.Nginx临时文件夹配置
一 浏览器缓存
1.1 缓存概述
- proxy_cache_path和proxy_cache
- Cache-Control和Pragma
1.2 缓存机制
- 浏览器无缓存
- 浏览器有缓存
- 校验是否过期
1.3 Nginx缓存类型
- 服务器缓存
- 代理缓存
- 客户端缓存
1.4 Nginx代理缓存原理
1.5 缓存内容
Cache-directive | 说明 |
public | 所有内容都将被缓存(客户端和代理服务器都可缓存)。 |
private | 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)。 |
no-cache | 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证停牌(ETag),no-cache会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。 |
no-store | 所有内容都不会被缓存到缓存或Internet临时文件中,强制缓存和对比缓存都不会触发。 |
must-revalidation.proxy-revalidation | 如果缓存内容失败,请求必须发送到服务器、代理以进行重新验证。 |
max-age=xxx(xxx is numeric) | 缓存的内容将在xxx秒失效,这个选项只在HTTP 1.1可用,并如果和Last-Modified一起使用时,优先级较高。 |
1.6 缓存规则
- proxy_buffering默认为on,若proxy_buffering设置为off,则NGINX不会缓存响应。
- proxy_ignore_headers可以配置忽略Cache-Control:
1 location /images/ {2 proxy_cache my_cache;
3 proxy_ignore_headers Cache-Control;
4 proxy_cache_valid any 30m;
5 # ...
6 }
二 Nginx缓存配置项
2.1 expires配置
1 server {2 listen 80;
3 server_name xxx.xxx.com;
4 root /app/xxx/html/;
5 location ~ .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$
6 {
7 expires 7d;
8 }
9
10 location ~ .*\.(?:js|css)$
11 {
12 expires 7d;
13 }
14
15 location ~ .*\.(?:htm|html)$ #不缓存html
16 {
17 add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
18 }
19 }
- Public:指示响应可被任何缓存区缓存。
- Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
- no-cache:指示请求或响应消息不能缓存。
- no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
- max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
- min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
- max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
2.2 proxy_cache配置
1 proxy_cache mycache;
2.3 proxy_cache_path配置
- path:定义缓存文件存放位置;
- levels:定义缓存路径的目录层级,默认所有缓存文件都放在上面指定的根路径中,最多三级,每层目录长度为1或2字节;
- keys_zone:name表示共享内存名称,用于在共享内存中定义一块存储区域来存放缓存的 key 和 metadata(类似于使用次数),这样 nginx 可以快速判断一个 request 是否命中缓存。由proxy_cache指令使用;size表示共享内存大小,1mb大约可以存放8000个key;
- max_size:设置缓存大小的上限。它是可选的,不指定值允许缓存增长以使用所有可用磁盘空间。当缓存大小达到限制时,称为缓存管理器的进程将删除最近最少用于将缓存大小恢复到限制之下的文件;
- inactive:在inactive时间内没有被访问的缓存会被淘汰掉,默认是10分钟;
- use_temp_path:如果为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 temp_path 指定的临时存储路径。
1 http {2 ...
3// 缓存目录:/data/nginx/cache
4// 缓存名称:one
5// 缓存占用内存空间:10m
6// 缓存目录级别为2
7// 缓存最大时间为60分钟
8// 加载器每次迭代过程最多执行300毫秒
9// 加载器每次迭代过程中最多加载200个文件
10// 缓存硬盘空间最多为 200m
11 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m inactive=60m loader_threshold=300 loader_files=200 max_size=200m;
12 server {
13 listen 8080;
14// 使用名称为one的缓存
15 proxy_cache one;
16 location / {
17// 此location中使用默认的缓存配置
18 proxy_pass http://backend1;
19 }
20 location /some/path {
21 proxy_pass http://backend2;
22// 缓存有效期为1分钟
23 proxy_cache_valid any 1m;
24// 被请求3次以上时才缓存
25 proxy_cache_min_uses 3;
26// 请求中有下面参数值时不走缓存
27 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
28 }
29 }
30 }
- 缓存管理器:定期检查缓存状态,看缓存总量是否超出限制,如果超出,就移除其中最少使用的部分
- 缓存加载器:加载器只在nginx启动后运行一次,把缓存内容的元数据信息加载到内存空间,如果一次性加载全部缓存信息,会大量消耗资源,使nginx在启动后的几分钟里变慢,为避免此问题,有3种加载策略:
- loader_threshold:指定每次加载执行的时间
- loader_files:每次最多加载的数量
- loader_sleeps:每次加载的延时
2.3 proxy_cache_valid配置
1 ……2 proxy_cache_valid 200 302 10m;
3 proxy_cache_valid 404 1m;
4 ……
1 ……2 proxy_cache_valid any 5m;
3 ……
2.4 proxy_cache_methods配置
2.5 proxy_cache_key string
2.6 proxy_cache_min_uses
1 ……2 proxy_cache_min_uses 5;
3 ……
4
2.7 proxy_cache_bypass
1 ……2 proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
3 ……
4
2.8 proxy_no_chache string
1 ……2 proxy_no_chache $cookie_nocache $arg_nocache $arg_nocache;
3 ……
4
2.9 proxy_cache_use_stale
1 ……2 proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
3 ……
4
2.10 proxy_cache_lock
1 ……2 proxy_cache_lock on;
3 ……
4
2.11 proxy_cache_lock_timeout
1 ……2 proxy_cache_lock_timeout 5s;
3 ……
4
三 缓存配置实例
参考文档:https://www.myfreax.com/nginx-caching-guide/。
四 缓存清除
4.1 清除缓存配置
1 location ~ /purge(/.*) {2 allow 127.0.0.1;
3 allow 192.168.55.0/24;
4 deny all;
5 proxy_cache_purge cache_one $1$is_args$args;
6 }
4.2 脚本清除
1 #!/bin/sh2 #****************************************************************#
3 # ScriptName: nginx_cache_clean.sh
4 # Author: null
5 # Create Date: 2020-06-24 00:03
6 # Modify Author: xhy
7 # Modify Date: 2020-06-24 00:03
8 # Version:
9 #***************************************************************#
10 echo -e "\n"
11 echo -n -e "\e[35;1m请输入Nginx Proxy_cache缓存的具体路径(提示:可使用Tab补全!)\e[0m\e[34;5m:\e[0m"
12read -e path
13 CACHE_DIR=$path
14 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
15 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
16 echo -n -e "\e[32;1m请输入删除操作的类型:\n1.按文件类型删除\t2.按具体文件名删除\t3.按文件目录删除\n:"
17read action
18 case $action in
19 1)
20 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
21 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
22 echo -n -e "\e[34;1m 请输入你要删除的缓存文件类型(多个参数可空格隔开)\e[0m\e[34;5m:\e[0m"
23read -a FILE
24 for i in `echo ${FILE[*]}|sed 's/ /\n/g'`
25 do
26 grep -r -a \.$i ${CACHE_DIR}| awk 'BEGIN {FS=":"} {print $1}' > /tmp/cache_list.txt
27 for j in `cat /tmp/cache_list.txt`
28 do
29 rm -rf $j
30 echo "$i $j 删除成功!"
31 done
32 done
33 ;;
34 2)
35 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
36 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
37 echo -n -e "\e[33;1m 请输入你要删除的缓存文件具体名称(多个参数可空格隔开)\e[0m\e[34;5m:\e[0m"
38read -a FILE
39 for i in `echo ${FILE[*]}|sed 's/ /\n/g'`
40 do
41 grep -r -a $i ${CACHE_DIR}| awk 'BEGIN {FS=":"} {print $1}' > /tmp/cache_list.txt
42 for j in `cat /tmp/cache_list.txt`
43 do
44 rm -rf $j
45 echo "$i $j 删除成功!"
46 done
47 done
48 ;;
49 3)
50 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
51 echo -e "\e[32;1m----------------------------------------------------------------\e[0m"
52 echo -n -e "\e[33;1m支持的模式有:\n1.清除网站cache目录下的所有缓存:cache.aa.com/data/cache/\n2.清除网站shop下的所有缓存:cache.aa.com/data/upload/shop\n3.清除网站根目录下的所有缓存:cache.aa.com\e[0m\n"
53 echo -n -e "\e[34;1m 请输入你要删除的缓存文件具体目录\e[0m\e[34;5m:\e[0m"
54read -a FILE
55 for i in `echo ${FILE[*]}|sed 's/ /\n/g'`
56 do
57 grep -r -a "$i" ${CACHE_DIR}| awk 'BEGIN {FS=":"} {print $1}' > /tmp/cache_list.txt
58 for j in `cat /tmp/cache_list.txt`
59 do
60 rm -rf $j
61 echo "$i $j 删除成功!"
62 done
63 done
64 ;;
65 *)
66 echo "输入错误,请重新输入"
67 ;;
68 esac
以上是 009.Nginx临时文件夹配置 的全部内容, 来源链接: utcz.com/a/57942.html