簡體   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