在 linux 中,nginx 本身不直接提供命令行工具来清除特定缓存文件,因为 nginx 的缓存(如 proxy_cache)是存储在磁盘上的普通文件。要手动清除指定缓存,最直接的方法是找到缓存存储目录,然后使用 `rm` 命令删除对应的文件。缓存文件的命名通常基于请求 uri 的 md5 哈希值,因此你需要先计算出目标 uri 的哈希值,再定位并删除该文件。

如何确定缓存文件的具体路径和文件名
要删除特定的缓存文件,首先需要知道 Nginx 配置中 `proxy_cache_path` 定义的目录位置,以及缓存键(cache key)的生成规则。默认情况下,如果未自定义 `proxy_cache_key`,Nginx 会使用 `$scheme$proxy_host$request_uri` 作为键,并将其转换为小写 MD5 哈希值作为文件名。因此,确定路径的关键是检查 Nginx 配置文件中的 `proxy_cache_path` 指令,而确定文件名则需要计算请求 URI 的 MD5 值。

#!/bin/bash
# 定义变量
URI="/api/v1/users"
CACHE_PATH="/var/cache/nginx/proxy_cache"
# 计算 URI 的 MD5 哈希值(小写)
HASH=$(echo -n "$URI" | md5sum | awk '{print $1}')
# 构建完整的缓存文件路径
# Nginx 默认将哈希值按层级分布,例如前两位为目录,后两位为子目录,剩余为文件名
# 但如果没有设置 levels=,则所有文件都在 CACHE_PATH 根目录下
LEVELS="1:2"
DIR_PREFIX=${HASH:0:1}
DIR_SUFFIX=${HASH:1:2}
if [ "$LEVELS" = "1:2" ]; then
FILE_PATH="${CACHE_PATH}/${DIR_PREFIX}/${DIR_SUFFIX}/${HASH}"
elif [ -z "$LEVELS" ] || [ "$LEVELS" = "off" ]; then
FILE_PATH="${CACHE_PATH}/${HASH}"
else
# 其他 levels 格式可根据实际配置调整
FILE_PATH="${CACHE_PATH}/${HASH}"
fi
# 检查文件是否存在并删除
if [ -f "$FILE_PATH" ]; then
rm -v "$FILE_PATH"
echo "Cache file for $URI deleted successfully."
else
echo "Cache file not found at $FILE_PATH"
fi
上述脚本展示了如何根据 URI 计算哈希值并构建路径。在实际操作中,你需要将 `CACHE_PATH` 替换为你 Nginx 配置中实际设置的缓存目录。如果配置中使用了 `levels` 参数,脚本中的路径构建逻辑需要相应调整。例如,如果 `levels=1:2`,则文件位于 `${CACHE_PATH}/${HASH:0:1}/${HASH:1:2}/${HASH}`。运行此脚本后,指定的缓存文件将被删除,Nginx 在下一次请求该 URI 时会重新从后端获取内容并生成新的缓存文件。
如何批量清除过期或无效的缓存文件
除了手动删除单个文件,有时需要批量清除缓存,例如当后端 API 发生大规模变更时。可以使用 `find` 命令结合 `mtime` 或 `ctime` 来查找并删除特定时间之前创建的缓存文件。此外,如果缓存文件过多,手动计算每个 URI 的哈希值并不现实,此时可以依赖操作系统的文件时间戳来清理旧缓存。这种方法适用于定期维护场景,确保缓存不会占用过多磁盘空间或包含过时的数据。

#!/bin/bash # 定义缓存目录 CACHE_PATH="/var/cache/nginx/proxy_cache" # 清除超过 7 天未访问的缓存文件 find "$CACHE_PATH" -type f -atime +7 -delete # 或者清除超过 7 天未修改的缓存文件 # find "$CACHE_PATH" -type f -mtime +7 -delete echo "Old cache files cleared from $CACHE_PATH"
这个脚本使用 `find` 命令递归遍历缓存目录,查找最后访问时间(`-atime`)或修改时间(`-mtime`)超过 7 天的文件,并直接删除它们。`-delete` 选项会立即执行删除操作,无需额外调用 `rm`。你可以根据实际需求调整天数,例如设置为 1 天以更频繁地清理。需要注意的是,这种批量删除方式不会影响正在进行的请求,但可能导致部分用户在下一次请求时经历短暂的缓存缺失,直到新缓存被生成。在生产环境中,建议在低峰期执行此类操作,以减少对用户体验的影响。
基于 proxy_cache_key 配置差异导致的缓存命中问题
当 Nginx 的 `proxy_cache_key` 配置发生变化时,原有的缓存文件可能不再有效,导致缓存命中率下降或返回错误内容。例如,如果将 `proxy_cache_key` 从 `$request_uri` 改为 `$scheme$host$request_uri`,那么对于同一个 URI,新的哈希值将与旧的哈希值不同,Nginx 会认为这是一个新的请求,从而向源服务器发起新请求并生成新的缓存文件。旧的缓存文件仍然存在,但永远不会被命中,造成资源浪费。在这种情况下,需要手动清理旧的缓存文件,以确保缓存系统的一致性。


















