You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何正确配置Ingress缓存?配置特定主机缓存时遇404错误且配置未写入nginx.conf的问题求助

解决Nginx Ingress缓存配置导致404及配置未生效问题

你遇到的两个问题(添加缓存配置后触发404、配置未写入nginx.conf)其实是关联的,下面我一步步帮你排查解决:

问题根源分析

你在server-snippet里直接用了proxy_cache static-cache;,但这个static-cache缓存区并没有在Nginx的全局http块中定义。Nginx启动时会严格检查配置语法,发现未定义的缓存区就会拒绝加载新配置,进而触发Ingress Controller回滚到之前的有效配置——这就是缓存配置没出现在nginx.conf里的原因,同时因为配置加载失败,服务也会返回404错误。

具体解决步骤

1. 验证配置错误日志

先确认我的推测,查看Ingress Controller的Pod日志,检查是否有缓存区未定义的报错:

kubectl logs -n ingress-nginx <你的Ingress Controller Pod名称>

你大概率会看到类似unknown cache zone "static-cache"的错误提示。

2. 修正Ingress配置,添加全局缓存区定义

需要先在http块中定义缓存路径和缓存区(用config-snippet注解,它会把内容插入到Nginx的http块),再在server-snippet里引用这个缓存区。修改后的完整Ingress配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: images-ingress
  labels:
    last_updated: "14940999355"
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: 8m
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    # 新增:在http块定义缓存区
    nginx.ingress.kubernetes.io/config-snippet: |
      proxy_cache_path /var/cache/nginx/static-cache levels=1:2 keys_zone=static-cache:10m max_size=10g inactive=24h use_temp_path=off;
    # 保留原server-snippet配置,确保缓存区名称一致
    nginx.ingress.kubernetes.io/server-snippet: |
      proxy_cache static-cache;
      proxy_cache_valid 404 10m;
      proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503 http_504;
      proxy_cache_bypass $http_x_purge;
      add_header X-Cache-Status $upstream_cache_status;
spec:
  tls:
  - hosts:
    - static.qwstrs.com
    secretName: letsencrypt-prod
  rules:
  - host: static.qwstrs.com
    http:
      paths:
      - path: /
        backend:
          serviceName: imaginary
          servicePort: 9000

这里解释下proxy_cache_path的关键参数:

  • /var/cache/nginx/static-cache:缓存文件的存储路径
  • levels=1:2:设置两层缓存目录,提升文件查找效率
  • keys_zone=static-cache:10m:分配10MB内存存储缓存键和元数据,名称要和proxy_cache里的一致
  • max_size=10g:缓存最大容量,超出后自动清理旧缓存
  • inactive=24h:24小时未被访问的缓存文件会被清理
  • use_temp_path=off:直接写入缓存目录,减少临时文件的额外IO开销

3. 应用配置并验证

应用修改后的Ingress配置:

kubectl apply -f your-ingress.yaml

然后进入Ingress Controller的Pod,检查nginx.conf是否已包含缓存配置:

# 检查http块的缓存路径定义
kubectl exec -n ingress-nginx <你的Ingress Controller Pod名称> -- cat /etc/nginx/nginx.conf | grep -A 10 "proxy_cache_path"
# 检查server块的缓存配置
kubectl exec -n ingress-nginx <你的Ingress Controller Pod名称> -- cat /etc/nginx/nginx.conf | grep -A 10 "proxy_cache static-cache"

如果能看到对应配置,说明生效了。此时访问服务不会再出现404,还能通过X-Cache-Status响应头查看缓存状态(比如HIT、MISS)。

4. 额外检查:缓存目录权限

官方Nginx Ingress镜像已默认配置好缓存目录权限,但如果是自定义镜像,需要确保Nginx进程(通常是www-data用户)对/var/cache/nginx/static-cache有读写权限:

kubectl exec -n ingress-nginx <你的Ingress Controller Pod名称> -- ls -ld /var/cache/nginx/static-cache

内容的提问来源于stack exchange,提问作者Сергей Коновалов

火山引擎 最新活动