在kubernetes GKE上为Nginx Ingress控制器设置缓存控制标头

时间:2018-10-08 22:50:32

标签: nginx kubernetes kubernetes-ingress google-kubernetes-engine nginx-ingress

我有一个Ingress-nginx控制器来处理到GKE上托管的Kubernetes集群的流量。我按照文档中的头盔安装说明进行设置:

Docs here

大多数情况下一切正常,但是如果我尝试通过server-snippet注释设置与缓存相关的参数,则所有应获取缓存控制标头的提供的内容都将返回为{{1} }。

这是我的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文件等)。

有什么想法会发生这种情况吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

这些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中获取)和/或在nginx将在其中查阅入口Pod的日志中,这是无价的。发出有用的调试文本。

答案 1 :(得分:0)

configuration-snippet将与nginx入口一起使用

您可以使用类似的

nginx.ingress.kubernetes.io/configuration-snippet : |
      if ($request_uri ~* \.(js|css|gif|jpe?g|png)) {
        expires 1M;
        add_header Cache-Control "public";
      }