要真正测出 Nginx 缓存与压缩的实际效果,需从请求链路、响应数据、缓存行为、资源体积四维度同步验证:先确认缓存命中(如X-Cache: HIT、日志upstream_cache_status)、再检查压缩是否生效(Vary: Accept-Encoding、Content-Encoding及Content-Length对比)、接着用ab/wrk压测TTFB与QPS变化,最后排除CDN冗余、IE6兼容、磁盘I/O、过高压缩比等常见“假优化”陷阱。

要真正测出 Nginx 缓存与压缩的实际效果,不能只看单次请求或配置是否“开了”,得从请求链路、响应数据、缓存行为、资源体积四个维度同步验证。核心逻辑是:先让缓存生效,再确认压缩没被绕过,最后用真实指标说话。
一、验证缓存是否真生效
光在配置里加了 expires 或 fastcgi_cache 不代表缓存就起作用。重点看三件事:
- 浏览器 DevTools 的 Network 标签页里,静态资源(如 .js/.css/.png)响应头是否有
Cache-Control: max-age=2592000或Expires字段,且状态码是200 (from disk cache)或304 - 动态页面(如 PHP)启用 FastCGI 缓存后,在 Nginx 日志中开启
$upstream_cache_status变量,例如在 log_format 中加入:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_cache_status"';
重启后观察日志中是否频繁出现HIT(命中)、MIS(未命中)、BYPASS(被跳过) - 用
curl -I http://yoursite.com/test.php多次请求,检查响应头是否含X-Cache: HIT(需在 Nginx 配置中手动添加:add_header X-Cache $upstream_cache_status;)
二、确认 Gzip/Brotli 压缩未被干扰
缓存和压缩容易冲突——比如缓存了未压缩的响应,后续请求直接返回,压缩就形同虚设。关键检查点:
- 确保
gzip_vary on;已启用。它会让 Nginx 在响应头中加Vary: Accept-Encoding,这样 CDN 或代理层才知道:压缩版和非压缩版是不同变体,该分别缓存 - 避免在缓存策略中忽略编码差异。例如 FastCGI 缓存 key 必须包含编码信息:
fastcgi_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding"; - 用
curl -H "Accept-Encoding: gzip" -I http://yoursite.com/style.css和curl -H "Accept-Encoding: identity" -I http://yoursite.com/style.css分别测试,对比Content-Encoding响应头和Content-Length是否变化
三、用真实工具做端到端压测
本地 curl 或浏览器 F12 只能看单点,要评估综合性能得模拟并发场景:
- 用
ab(Apache Bench)或wrk对同一 URL 做两次压测:第一次清空所有缓存(重启 Nginx 或清 FastCGI 缓存目录),第二次在缓存已热的状态下运行,对比Time per request和Requests per second - 重点关注 TTFB(Time to First Byte)。缓存生效后,PHP 动态页的 TTFB 应从 200ms+ 降到 10–30ms;若下降不明显,大概率是缓存 key 冲突、cookie 干扰(需
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;)或后端返回了禁止缓存的头 - 配合
nginx -t && nginx -s reload后,用varnishstat(若前端接 Varnish)或nginx -V 2>&1 | grep -o with-http_v2_module确认模块加载正常,避免因模块缺失导致压缩/缓存功能静默失效
四、排查常见“假优化”陷阱
很多调优看似正确,实则无效甚至负向:
- 对已由 CDN 缓存的资源,还在 Nginx 层配
expires—— 浏览器根本收不到这个头,纯属冗余 - 开启
gzip却没关gzip_disable "msie6",结果 IE6 用户请求触发降级,但现代浏览器反而因兼容逻辑多走判断分支 - FastCGI 缓存路径挂载在机械硬盘上,而缓存大小设为 1G,频繁写入导致 I/O 等待反拖慢响应 —— 建议用 tmpfs 挂载内存盘:
mount -t tmpfs -o size=512m tmpfs /var/cache/nginx/fastcgi_cache - 压缩级别设为
gzip_comp_level 9,CPU 占用飙升却只比 level 4 多压 2% 体积,得不偿失;一般 level 4–6 是性价比最优区间



















