要让 Nginx 临时目录彻底脱离磁盘 I/O,关键不是“挂个内存盘”,而是把所有会触发同步写、小文件刷盘、跨设备 rename 的临时路径,全部精准替换成受控的 tmpfs 挂载,并堵住应用层隐性落盘行为。Nginx 的临时环节主要集中在日志、代理缓存、客户端上传体、响应缓冲四类路径,每类都要单独识别、单独挂载、单独设限。
日志目录必须走 tmpfs,且带权限与容量控制
access.log 和 error.log 是高频追加写场景,每秒数千次小 write + fsync 是典型 I/O 元凶。不能只挂 /tmp 或靠 logrotate 轮转来缓解,而应直接接管日志根目录:
- 用 --tmpfs /var/log/nginx:rw,noexec,nosuid,mode=1777,size=128m 启动容器,确保 Nginx 配置中 access_log /var/log/nginx/access.log 显式指向该路径
- 宿主机需配合轻量同步:在容器内起守护进程,每 30 秒用 rsync --append-verify 增量同步新增日志到持久化目录,避免全量拷贝开销
- 禁止将 size 设为无上限,建议按峰值写入速率估算(如 10k QPS × 200B/条 ≈ 2MB/s,2 分钟缓冲需约 240MB,上浮后设 256m 更稳妥)
代理缓存路径必须直写 tmpfs,禁用临时中转
Nginx 默认先写 proxy_temp_path 再 rename 到 cache 目录,这不仅双倍落盘,跨挂载点还会静默失败。生产环境不推荐关掉缓存,但可将其物理位置移到内存:

在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
- 配置 proxy_cache_path /dev/shm/nginx_cache levels=2 keys_zone=mycache:128m max_size=8g use_temp_path=off;
- 启动前确保内核参数已调大:vm.shmmax = 8589934592(8GB)、vm.shmall = 2097152
- 删除所有 proxy_temp_path 配置项——它在 use_temp_path=off 下完全失效,残留反而引发误解
客户端上传临时路径必须隔离+两级子目录
表单上传、API 文件提交等操作,若落在系统盘或 overlayfs 上,大量小文件创建/删除会拖垮整个磁盘队列。这不是缓冲大小问题,而是路径归属问题:
- 不要用默认 /var/cache/nginx/client_body_temp,新建独立挂载点:mount -t tmpfs -o size=512m,mode=700 tmpfs /data/nginx/upload-temp
- Nginx 配置中显式声明:client_body_temp_path /data/nginx/upload-temp 1 2;(两级子目录防 inode 瓶颈)
- 配套调优:client_body_buffer_size 128k;、client_max_body_size 20m;、client_body_timeout 30s;,让中小请求全程走内存,大请求快速进入缓冲队列
响应缓冲与上游交互必须绕过磁盘回退
当后端返回体超过内存缓冲时,Nginx 默认启用磁盘临时文件机制(proxy_max_temp_file_size),这是高频代理场景下最隐蔽的 I/O 来源之一:
- 直接关闭磁盘缓冲:proxy_max_temp_file_size 0;,强制所有响应走内存缓冲
- 同步增大缓冲能力:proxy_buffer_size 16k;、proxy_buffers 16 64k;、proxy_busy_buffers_size 256k;
- 若业务允许低延迟透传(如内部服务调用),可进一步关闭缓冲:proxy_buffering off; + proxy_buffers 2 4k;,彻底消除中间落盘环节