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

Mur*_*ago 2 nginx kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress

我有一个ingress-nginx控制器处理流量到我在KKE上托管的Kubernetes集群.我使用docs中的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
Run Code Online (Sandbox Code Playgroud)

同样,它只是与正则表达式匹配的资源404(所有.js文件,.css文件等).

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

任何帮助表示赞赏!

mda*_*iel 8

这些location块是最后和/或最长匹配获胜,并且由于入口本身不提供任何此类内容,因此nginx依赖于指向上游服务器的proxy_pass指令.因此,如果你得到404,那很可能因为 location的匹配,从而干扰了那个proxy_pass.你configuration-snippet:可能真的想要一个非常好的机会,可能与if ($request_uri ~* ...) {添加标题相结合.

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

另外,为了调试nginx入口问题,查询它的实际内容通常是非常宝贵的nginx.conf,可以从任何一个入口Pod中获取,和/或查询入口Pod的日志,其中nginx将发出有用的调试文本.