[英]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.