nginx之在 kubernetes GKE 上为 nginx 入口 Controller 设置缓存控制 header

mfryf 阅读:19 2024-04-17 11:32:04 评论:0

我有一个 ingress-nginx Controller 处理到我托管在 GKE 上的 Kubernetes 集群的流量。我使用文档中的 helm 安装说明进行设置:

Docs here

大多数情况下,一切正常,但如果我尝试通过 server-snippet 设置缓存相关参数注释,所有应该获得缓存控制 header 的服务内容作为 404 返回.

这是我的 ingress-service.yaml文件:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
  name: ingress-service 
  annotations: 
    kubernetes.io/ingress.class: nginx 
    nginx.ingress.kubernetes.io/proxy-read-timeout: "4000" 
    nginx.ingress.kubernetes.io/proxy-send-timeout: "4000" 
    nginx.ingress.kubernetes.io/server-snippet: | 
      location ~* \.(js|css|gif|jpe?g|png)$ { 
        expires 1M; 
        add_header Cache-Control "public"; 
      } 
spec: 
  tls: 
    - hosts: 
        - example.com 
      secretName: example-com 
  rules: 
    - host: example.com 
      http: 
       paths: 
        - path: / 
          backend: 
            serviceName: client-cluster-ip-service 
            servicePort: 5000 
        - path: /api/ 
          backend: 
            serviceName: server-cluster-ip-service 
            servicePort: 4000 

同样,只有与正则表达式匹配的资源才返回 404 (所有 .js 文件、 .css 文件等)。

关于为什么会发生这种情况的任何想法?

任何帮助表示赞赏!

请您参考如下方法:

那些location块是 last and/or longest match wins ,并且由于入口 本身不提供任何此类内容,nginx 依赖于 proxy_pass directive指向上游服务器。因此,如果您收到 404,很可能是因为您的 location匹配,从而干扰 proxy_pass一。您很有可能真正想要 configuration-snippet: 相反,可能与 if ($request_uri ~* ...) { 结合使用添加标题。

可以使用指向 python3 -m http.server 9090 的微不足道的 nginx.conf 在本地尝试此操作。或任何虚假的上游目标。

另外,对于调试nginx入口问题,查阅其实际nginx.conf往往是无价的。 ,可以从任何一个入口 Pod 中获取,和/或查阅入口 Pod 的日志,nginx 将在其中发出有用的调试文本。


标签:nginx
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号