You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minikube环境Nginx Ingress响应缓存始终返回X-Cache-Status:MISS问题

Nginx Ingress响应缓存持续返回MISS修复方案

现有配置存在的问题

  • YAML格式错误:/bye路径的后端配置结构非法,service字段下多了无效的bye键,会导致该路径路由规则失效,需先对齐/hello路径的配置结构。
  • 正常响应无缓存规则:当前配置仅为404状态码设置了5分钟缓存有效期,未对200、302等正常成功响应配置缓存规则,Nginx默认不会缓存未明确匹配proxy_cache_valid规则的响应,这是缓存始终不命中的核心原因。
  • 响应头拦截配置不全:仅配置忽略Cache-Control头不足以绕过缓存限制,后端返回的Cache-Control: Private、Set-Cookie、Expires等头默认都会触发Nginx跳过缓存逻辑。
  • 配置冲突:开启nginx.ingress.kubernetes.io/cache-enable: "true"注解后,Ingress控制器会自动注入proxy_cache相关配置,手动在configuration-snippet中重复声明proxy_cache mycache大概率会出现规则覆盖、逻辑冲突。
  • 缓存目录权限问题:Minikube环境中Ingress Nginx控制器默认以非root用户运行,/tmp/nginx_cache目录可能存在写入权限不足的问题,导致缓存文件根本无法生成。

修正后的配置

1. Ingress资源配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  labels:
    name: test
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/cache-enable: "true"
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    # 为200/302响应配置10分钟缓存有效期,可按需调整时长
    nginx.ingress.kubernetes.io/proxy-cache-valid: "200 302 10m"
    # 忽略所有会阻止缓存的后端响应头
    nginx.ingress.kubernetes.io/proxy-ignore-headers: "Cache-Control Expires Set-Cookie"
    nginx.ingress.kubernetes.io/proxy-cache-lock: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      # 隐藏后端返回的Cache-Control头,避免Private等配置干扰
      proxy_hide_header Cache-Control;
      # 对外返回公共缓存标识,加always确保所有状态码都返回该头
      add_header Cache-Control "public, max-age=600" always;
      add_header X-Cache-Status $upstream_cache_status always;
spec:
  rules:
  - host: myhost.local
    http:
      paths:
        - path: /hello
          pathType: Prefix
          backend:
            service:
              name: hello-api
              port:
                number: 8080
        - path: /bye
          pathType: Prefix
          backend:
            service:
              name: bye-api
              port:
                number: 8081

2. Ingress控制器ConfigMap配置

将缓存路径调整为Nginx默认有读写权限的/var/cache/nginx/目录,同时显式声明缓存键规则:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  http-snippet: |
    proxy_cache_path /var/cache/nginx/ levels=1:2 keys_zone=mycache:10m use_temp_path=off max_size=4g inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";

验证流程

  1. 应用上述修正后的配置,重启Ingress Nginx控制器Pod确保所有配置加载生效。
  2. 首次发起接口请求,响应头X-Cache-Status返回MISS为正常现象,代表Nginx已将该响应写入缓存。
  3. 第二次发起完全相同的请求,响应头X-Cache-Status将返回HIT,代表缓存已正常生效。
  4. 如果持续返回MISS,可进入Ingress控制器容器执行ls /var/cache/nginx/查看是否有缓存文件生成,排查目录权限、挂载相关问题。

注意:如果接口需要根据Cookie、自定义请求头返回差异化内容,需要将对应变量加入proxy_cache_key规则中,避免出现不同用户拿到相同缓存内容的问题。

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:48:46