温馨提示×

nginx缓存问题如何查日志

小樊
42
2026-10-20 04:48:29
栏目: 编程语言

排查 Nginx 缓存问题,主要看 access 日志、error 日志,必要时开启 debug 日志 或 缓存命中日志变量。下面按实战步骤说明。


一、先确认你用的是哪种“缓存”

Nginx 常见缓存有:

  1. proxy_cache(反向代理缓存)
  2. fastcgi_cache(PHP 等)
  3. uwsgi_cache / scgi_cache
  4. 浏览器缓存(非 Nginx 缓存)

下面以 proxy_cache 为例(最常见)。


二、最关键的:在 access_log 中记录缓存命中状态

1️⃣ 在 nginx.conf 中定义日志格式

log_format cache_log '$remote_addr - $upstream_cache_status [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent"';

2️⃣ 在 server / location 中启用

access_log /var/log/nginx/access.log cache_log;

3️⃣ 查看 upstream_cache_status

请求后看日志,会出现以下值:

状态 含义
HIT 命中缓存
MISS 未命中,回源
EXPIRED 缓存过期
BYPASS 被绕过(如 Cache-Control)
STALE 返回旧缓存
UPDATING 正在更新缓存
REVALIDATED 重新验证成功

示例:

10.0.0.1 - HIT [10/Oct/2024:10:00:00] "GET /api/test HTTP/1.1" 200 1234

✅ 这是判断缓存是否生效的第一手证据


三、检查 Nginx 缓存配置是否正确

proxy_cache 基本配置示例

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

常见错误:

  • ❌ 没有 proxy_cache
  • ❌ Cache-Control: no-store / private
  • ❌ 后端返回 Set-Cookie
  • ❌ 请求带 Authorization
  • ❌ 使用 POST 请求

四、开启 Nginx Debug 日志(进阶)

1️⃣ 编译时支持 debug(通常官方包已支持)

nginx -V 2>&1 | grep debug

2️⃣ 修改 nginx.conf

error_log /var/log/nginx/error.log debug;

3️⃣ 查看缓存相关日志

搜索关键字:

grep -i cache /var/log/nginx/error.log

你会看到:

  • 是否写入缓存
  • 缓存 key
  • 为什么没缓存(no cacheable)

五、手动验证缓存是否生成

1️⃣ 查看缓存目录

ls -R /data/nginx/cache

2️⃣ 查看缓存文件内容

cat /data/nginx/cache/xxx

3️⃣ 手动 curl 测试

curl -I https://example.com/test

看响应头:

X-Cache: HIT
Cache-Control: max-age=600

(需自行加 add_header X-Cache $upstream_cache_status;)


六、常见问题速查表

问题 排查点
一直 MISS 后端 no-cache / Set-Cookie
偶尔 HIT Cache key 不一致
缓存不更新 inactive / proxy_cache_valid
登录接口被缓存 带 Cookie / Authorization
缓存目录为空 proxy_cache_path 权限

七、推荐一条“排错命令流”

tail -f /var/log/nginx/access.log | grep -E 'HIT|MISS|EXPIRED'

如果你愿意,可以把:

  • nginx 缓存配置
  • access 日志片段
  • 后端响应头

贴出来,我可以帮你精确指出问题点。

0 踩