在 nginx 中,`proxy_cache_path` 的 `temp_path` 参数用于指定代理缓存的临时文件存储目录。配置时,只需在 `proxy_cache_path` 指令中将路径字符串的第一个部分设为目标临时目录即可,nginx 会先将下载的内容写入该临时目录,待完整接收后原子性地移动到最终的缓存目录。

如何配置 proxy_cache_path 以指定临时目录
要指定临时目录,直接在 `proxy_cache_path` 指令中修改第一个参数。例如,将 `/var/cache/nginx/temp` 设为临时目录,`/var/cache/nginx/data` 设为最终缓存目录。Nginx 启动或重载配置后,会在临时目录下创建 `.tmp` 后缀的文件,传输完成后重命名为实际缓存文件。

server {
listen 80;
server_name example.com;
# 定义缓存路径:临时目录 /data/nginx/temp,最终目录 /data/nginx/cache
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
# 注意:从 Nginx 1.7.9 开始,use_temp_path 默认为 on,即自动使用 temp_path 指定的子目录
# 如果希望显式分离,可以这样写(假设 temp_path 是 proxy_cache_path 的一部分):
# proxy_cache_path /data/nginx/cache/temp /data/nginx/cache levels=1:2 ...
# 但更常见的做法是利用 use_temp_path 参数控制是否分离
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}
上述配置中,`proxy_cache_path` 的第一个路径 `/data/nginx/cache` 是最终缓存目录。若需指定独立的临时目录,可使用 `use_temp_path` 参数(Nginx 1.7.9+)。若 `use_temp_path` 为 `on`(默认),Nginx 会在最终缓存目录下创建一个名为 `temp` 的子目录作为临时存储。若设为 `off`,则直接写入最终目录。若要完全独立于最终目录,需在 `proxy_cache_path` 中明确指定两个路径,或者通过符号链接等方式实现,但标准做法是使用 `use_temp_path` 配合默认行为,或在高版本中利用其灵活性。实际上,`proxy_cache_path` 语法允许指定多个路径,但通常我们只关注 `use_temp_path` 开关。若需严格分离,可考虑将 `temp_path` 指向一个高性能 SSD,而 `cache_path` 指向大容量 HDD。
为什么需要分离临时目录和缓存目录
分离临时目录和缓存目录的主要目的是优化 I/O 性能。代理缓存过程涉及大量顺序写入操作,这些操作会产生大量的磁盘 I/O。如果临时文件和最终缓存文件都在同一个磁盘上,可能会导致缓存命中时的读取操作与写入操作竞争磁盘带宽,从而影响整体性能。通过将临时目录设置在更快的存储介质(如 SSD)上,可以将写入压力与读取压力分离,提高缓存效率。

# 示例:将临时目录放在 SSD,缓存目录放在 HDD
proxy_cache_path /mnt/hdd/cache levels=1:2 keys_zone=my_cache:10m max_size=100g inactive=60m use_temp_path=on;
# 此时,Nginx 会在 /mnt/hdd/cache/temp 下创建临时文件
# 如果需要将临时文件放在单独的 SSD 上,可以这样做:
# 首先确保 /mnt/ssd/temp 存在且有足够空间
# 然后,由于 Nginx 的 proxy_cache_path 不支持直接指定两个不同的物理路径作为 temp 和 cache,
# 我们通常使用符号链接或 mount 绑定来实现。
# 例如,将 /mnt/hdd/cache/temp 符号链接到 /mnt/ssd/temp
# ln -s /mnt/ssd/temp /mnt/hdd/cache/temp
# 这样,当 Nginx 写入 /mnt/hdd/cache/temp 时,实际数据会写入 /mnt/ssd/temp
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
}
}
这种配置方式利用了操作系统的符号链接功能,实现了逻辑上的分离。在实际应用中,可以根据硬件条件灵活调整。例如,如果服务器有多个磁盘,可以将临时目录放在读写速度最快的磁盘上,而将最终缓存放在容量更大、成本更低的磁盘上。此外,还可以结合 `proxy_cache_key` 和 `proxy_cache_valid` 等指令,进一步优化缓存策略。
proxy_cache_path 中 temp_path 的具体行为是什么
当 `use_temp_path` 设置为 `on` 时,Nginx 会在 `proxy_cache_path` 指定的主目录下创建一个名为 `temp` 的子目录,所有代理下载的临时文件都会先写入这个子目录。一旦文件下载完成,Nginx 会将其原子性地移动到主目录下的相应缓存位置。如果 `use_temp_path` 设置为 `off`,则临时文件直接写入主目录,没有独立的临时子目录。这种行为确保了在文件传输过程中,即使发生中断,也不会污染最终的缓存目录,因为临时文件位于独立的子目录中,且只有在传输成功后才会被移动。











