nginx - 在 kubernetes GKE 上为 nginx 入口控制器设置缓存控制标头
问题描述
我有一个 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
块是最后一个和/或最长的匹配获胜,并且由于入口本身不提供任何此类内容,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 将发出有用的调试文本。
推荐阅读
- javascript - 如何使用 JavaScript 更改用户代理?
- wpf - 如何在圆形进度条中创建圆形线帽
- hadoop - 如何将 Gobblin 输出分区为 30 分钟分区?
- scala - 为什么案例类要求覆盖equals()?
- c# - 换行表达式
> 使用类型转换 - javascript - 通过 javascript 发送电子邮件
- c# - C# declare class member variable type of itself pointer
- python - 如何将我的 excel 工作表插入数据库
- python - 带有csv时间表的python
- c# - 为什么在 ASP.NET CORE MVC 中应用了错误的路由?