如何正确配置Ingress缓存?配置特定主机缓存时遇404错误且配置未写入nginx.conf的问题求助
你遇到的两个问题(添加缓存配置后触发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,提问作者Сергей Коновалов




