繁体   English   中英

在 kubernetes GKE 上为 nginx 入口控制器设置缓存控制标头

[英]Setting cache-control headers for nginx ingress controller on kubernetes GKE

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

文档在这里

在大多数情况下,一切正常,但如果我尝试通过server-snippet注释设置缓存相关参数,则所有应获得缓存控制标头的服务内容都会作为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 和/或最长的 match wins ,并且由于入口本身不提供任何此类内容,因此 nginx 依赖于指向上游服务器的proxy_pass指令 因此,如果您收到 404,很可能是因为您的location匹配,从而干扰了proxy_pass之一。 很有可能您实际上想要configuration-snippet:相反,可能与if ($request_uri ~* ...) {结合使用以添加标头。

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

另外,对于调试 nginx 入口问题,查阅其实际的nginx.conf通常是非常宝贵的,您可以从任何一个入口 Pod 中获取该文件,和/或查阅入口 Pod 的日志,其中 nginx 将发出有用的调试文本。

配置片段将与 nginx 入口一起使用

你可以使用类似的东西

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM