用 tmpfs 配 fastcgi_cache 可实现 sub-5ms PHP 响应,但需手动挂载合理大小的 tmpfs、严格匹配 Nginx 用户权限、禁用 use_temp_path、忽略干扰响应头并精准绕过敏感路径。

用 tmpfs 配 fastcgi_cache 是压榨 PHP 动态响应速度最直接的手段之一——缓存文件不落磁盘,全在内存里读写,毫秒级命中、零 IO 延迟。但关键不在“快”,而在“稳”:tmpfs 容易满、权限易错、大小难控,配置错一步,缓存就彻底失效或频繁驱逐。
先确认 tmpfs 挂载并分配合理空间
tmpfs 不是自动存在的,得手动挂载且大小要留余量。别直接用 /dev/shm——它默认只 64MB,对中高流量站点远远不够;也别用 /tmp,它可能被清理机制误删或受 SELinux 限制。
- 推荐挂载到
/run/nginx-cache或/mnt/fastcgi-cache,例如:sudo mount -t tmpfs -o size=2g,mode=755 tmpfs /run/nginx-cache - 加进
/etc/fstab确保重启不丢:tmpfs /run/nginx-cache tmpfs size=2g,mode=755 0 0 - 运行
df -h | grep nginx-cache确认挂载成功,且可用空间 ≥ 1.5 倍预估缓存体积(比如日均 50 万 PHP 请求,建议 ≥ 1.5G)
缓存路径与权限必须匹配 Nginx 工作用户
tmpfs 目录创建后默认属主是 root,而 Nginx worker 进程通常以 www 或 www-data 身份运行。若不改权限,$upstream_cache_status 永远是 BYPASS,error.log 只有模糊的 Permission denied。
- 执行:
sudo mkdir -p /run/nginx-cache/{temp,levels}sudo chown -R www:www /run/nginx-cachesudo chmod -R 755 /run/nginx-cache - 验证是否真能写:
sudo -u www touch /run/nginx-cache/test && echo "OK" || echo "FAIL" - 注意
levels=1:2要求子目录结构存在,{temp,levels}不是可选——漏建会导致缓存静默失败
fastcgi_cache_path 必须带 use_temp_path=off
tmpfs 的优势在于全程内存操作,但如果 Nginx 先写 temp 目录再 move 到 cache 目录,就会多一次跨文件系统拷贝,失去意义。必须显式禁用临时路径。
- 在
http{}块中写:fastcgi_cache_path /run/nginx-cache levels=1:2 keys_zone=fcgi:512m inactive=30m max_size=1.8g use_temp_path=off; -
keys_zone=fcgi:512m表示 key 索引区占内存 512MB(不是缓存内容),建议按站点 URL 基数估算:每百万唯一 URL 约需 8–12MB 索引空间 -
max_size=1.8g设为 tmpfs 总大小的 90%,防撑爆内存导致 OOM killer 杀进程
绕过缓存的逻辑必须精细,尤其对登录态和动态参数
WordPress、ZBlog、Laravel 等框架常在响应头塞 Cache-Control: no-cache 或返回 Set-Cookie,Nginx 默认会尊重这些头并跳过缓存——哪怕你写了 fastcgi_cache_valid 也无效。
- 必须加:
fastcgi_ignore_headers Cache-Control Expires Set-Cookie; - 同时用
map或if显式跳过敏感路径:set $skip_cache 0;<br>if ($request_uri ~* "/wp-admin/|/wp-login.php|/user/|/zb_system/") { set $skip_cache 1; }<br>if ($http_cookie ~* "wordpress_logged_in|PHPSESSID|username") { set $skip_cache 1; }<br>fastcgi_no_cache $skip_cache;<br>fastcgi_cache_bypass $skip_cache; - 不要用
$cookie_*或$http_user_agent做 cache_key——除非你要做设备级差异化缓存,否则直接破坏共享性,缓存利用率暴跌
本质上,tmpfs + fastcgi_cache 不是“开个开关就提速”,而是把缓存生命周期从磁盘 I/O 搬进内存地址空间。只要路径存在、权限对、key 稳定、干扰头被忽略、绕过逻辑精准,就能稳定跑出 sub-5ms 的 PHP 响应。不复杂但容易忽略细节。

















