在容器化部署中,nginx 的 proxy_cache 目录必须挂载为持久化卷(volume),否则容器重启后缓存将全部丢失。具体做法是在 docker-compose.yml 或 docker run 命令中,将宿主机的一个目录映射到容器内的 /var/cache/nginx 路径,并确保该目录对 nginx 进程具有读写权限。

如何配置 Docker Compose 实现缓存持久化
通过定义命名卷(Named Volume)并挂载到容器内的缓存路径,可以确保数据在容器重建后依然存在。需要在 docker-compose.yml 文件中同时配置 volumes 和 nginx.conf 中的缓存路径。

version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- cache_data:/var/cache/nginx
restart: always
volumes:
cache_data:上述配置中,cache_data 是一个命名卷,Docker 会自动管理其生命周期。Nginx 启动时会将缓存文件写入 /var/cache/nginx,这些数据实际存储在 Docker 管理的存储驱动中。即使删除容器并重新创建,只要不删除卷,缓存数据就会保留。这种方式避免了直接挂载宿主机目录可能遇到的权限问题,是容器化环境下的推荐做法。
为什么需要设置缓存路径的权限
Nginx 工作进程通常以非 root 用户(如 www-data 或 nginx)运行,如果挂载的目录权限不正确,会导致缓存写入失败。在 Docker 环境中,如果使用宿主机目录挂载,必须确保宿主目录的 UID/GID 与容器内 Nginx 进程的 UID/GID 一致。

# 在宿主机上执行
sudo mkdir -p /data/nginx/cache
sudo chown -R 101:101 /data/nginx/cache
# docker-compose.yml 部分配置
services:
nginx:
volumes:
- /data/nginx/cache:/var/cache/nginx默认官方 Nginx 镜像中,Nginx 进程的 UID 通常为 101。如果直接使用 docker run -v /host/path:/var/cache/nginx,而宿主目录属于 root 用户,Nginx 将无法写入缓存,导致 proxy_cache 失效。通过 chown 修改宿主目录所有者,或者使用 Docker 命名卷(自动处理权限),可以解决此问题。此外,还需在 nginx.conf 中正确配置 proxy_cache_path,指向挂载点。
基于 proxy_cache_path 配置的具体问题
在 nginx.conf 中,proxy_cache_path 指令必须指定与挂载目录完全一致的路径。如果配置错误,Nginx 会尝试写入未挂载的默认路径,导致缓存无法持久化或报错。
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
}
}
}上述配置中,/var/cache/nginx 必须与 Docker 挂载的目标路径一致。levels=1:2 定义了缓存文件的子目录层级,有助于提高文件系统性能。keys_zone 定义了共享内存区域的大小,用于存储缓存键和元数据。max_size 限制磁盘缓存的最大容量,超出后会根据策略清理。inactive=60m 表示如果在 60 分钟内未被访问,缓存条目将被删除。use_temp_path=off 强制缓存文件直接写入最终位置,避免跨文件系统移动带来的性能损耗和潜在错误。在实际操作中,务必检查 Nginx 错误日志,确认是否有 open() "/var/cache/nginx/..." failed (13: Permission denied) 之类的报错,这通常是挂载或权限配置错误的直接信号。


















