深入理解proxy_cache

一、proxy_cache概述

proxy_cache是nginx中自带的模块,用于缓存响应,在未来的请求中将缓存的响应直接返回,加快响应速度。proxy_cache与proxy_pass联用,将源站的响应缓存下来,省去了再向源站发起请求的步骤。这个特性在高并发的场景下非常有用,可以大幅度减轻源站的压力。

为了让proxy_cache发挥出更好的效果,需要根据具体的情况对代理的配置做出优化,如设置cache有效时间、cache大小限制等。

二、proxy_cache清除

在代理缓存中,为了避免脏数据和缓存失效,需要定期清理缓存。

1、手动清除


# 清空所有缓存
$ nginx -s stop
$ rm -rf /var/cache/nginx/*
$ nginx

2、自动清除

可以通过定期删除缓存目录下的过期文件来实现自动清除。在nginx.conf中进行配置:


http {
    proxy_cache_path /var/cache/nginx levels=1:2
                 keys_zone=my_cache:10m
                 inactive=60m;
    proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
    server {
        ...
        location / {
            proxy_cache my_cache;
            proxy_pass http://localhost:8000;
            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_cache_valid 200 10m; # 如果响应状态码为200,则缓存在10分钟有效
            proxy_cache_valid any 1m; # 如果响应状态码为非200,则缓存在1分钟有效

            proxy_cache_bypass $http_pragma;
            proxy_cache_revalidate on;
        }
        ...
    }
}

三、proxy_cache内存

proxy_cache数据可以存储在内存中,而不是磁盘上。这样做的优点是:读取速度更快,更适合缓存小文件或大量请求指向同一缓存的场景。默认情况下,nginx将缓存数据存储在磁盘上。

可以通过在CACHE_PATH中添加参数:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off max_size=100m可配置最大内存缓存容量。

四、proxy_cache站群

proxy_cache在站群架构中有着非常重要的作用。在使用proxy_cache站群时,源站响应需要缓存到多个服务器上,从而实现更高效的读取。在nginx.conf中配置如下:


upstream backend {
    server backend1.example.com:8080;
    server backend2.example.com:8080;
    ...
    server backendN.example.com:8080;
}

server {
    ...
    location / {
        proxy_cache my_cache;
        proxy_pass http://backend;
        add_header X-Proxy-Cache $upstream_cache_status;
    }
    ...
}

五、proxy_cache valid

proxy_cache_valid指令用来控制响应缓存的有效时间。在nginx.conf中可配置具体的响应状态码的缓存时间。


proxy_cache_valid 200 1h; # 缓存状态码为200的响应1小时
proxy_cache_valid 404 1m; # 缓存状态码为404的响应1分钟
proxy_cache_valid 500 1s; # 缓存状态码为500的响应1秒

六、proxy_cache nginx

nginx本身也可以作为代理被缓存。可以通过子服务配置实现proxy cache。


proxy_cache_path /var/cache/nginx keys_zone=my_zone:10m;

server {
    ...
    listen 8000;
    proxy_cache my_zone;
    proxy_pass http://localhost:9000;
    ...
}

七、proxy_cache清除批量

定期清理proxy cache是非常有必要的,但是对大型网站而言,手动清理的效率往往不能满足需求。

可以通过脚本实现nginx代理清除:


#!/bin/bash

# 缓存目录
cache_path=/var/cache/nginx

# 待删除的目录
remove_dirs=( $(find $cache_path/* -type d -mtime + 30) )

# 删除缓存目录下超时的缓存数据
for dir in ${remove_dirs[@]}
do
    echo "removing cache in $dir"
    rm -rf $dir/*
done

# 删除目录时,目录时完全匹配缓存项的key值,所以执行完之后需要调用一次proxy_cache_path指令
nginx -s reload 

八、proxy_cache一直Miss

如果在配置中出现了proxy_cache一直miss的情况,考虑以下几点:

  • 检查缓存目录是否存在,是否有可读写权限
  • 检查传递给代理的响应是否正确,可以通过curl模拟http请求或使用tcpdump等抓包工具进行调试
  • 检查proxy_cache_key是否正确,错误的代理键将导致缓存失效
  • 检查proxy_cache_valid指令,响应状态码是否已正确指定
  • 检查proxy_ignore_headers指令,是否包含响应头信息

通过上述方法进行排查,可以解决proxy_cache一直miss的问题,保持proxy_cache的有效性。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/195388.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-02 20:34
下一篇 2024-12-02 20:34

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25

发表回复

登录后才能评论