我有一个Ingress-nginx控制器来处理到GKE上托管的Kubernetes集群的流量。我按照文档中的头盔安装说明进行设置:
大多数情况下一切正常,但是如果我尝试通过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
文件等)。
有什么想法会发生这种情况吗?
感谢您的帮助!
答案 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";
}