Minikube+Grafana+Nginx Ingress配置异常:Root_URL不生效
解决Nginx Ingress与Grafana子路径配置冲突的问题
我之前也碰到过几乎一模一样的坑!核心问题出在Grafana的子路径运行配置缺失和Nginx Ingress的重写规则设置错误,咱们一步步把问题掰碎了解决:
1. 先修正Grafana的核心配置
Grafana默认是在根路径下运行的,当你要在/grafana/子路径下访问时,必须明确告诉它两件事:
- 它的对外访问根URL是什么
- 允许从子路径提供服务
把你的Grafana Deployment里的环境变量改成下面这样:
env: - name: GF_SERVER_ROOT_URL value: "%(protocol)s://%(domain)s/grafana/" # 注意末尾的斜杠,和Ingress路径保持一致 - name: GF_SERVER_DOMAIN value: "my-ingress-demo.com" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" # 关键!开启子路径服务支持
2. 修复Nginx Ingress的重写规则
你的Ingress配置缺少了路径重写的注解,导致Nginx把/grafana/的请求直接转发给Grafana,但Grafana内部只认/开头的路径,自然会返回404。加上重写注解后,要把/grafana/xxx的请求重写成/xxx转发给Grafana:
修正后的Ingress配置:
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /$1 # 重写规则:把/grafana/(.*)转到/$1 nginx.ingress.kubernetes.io/use-regex: "true" # 启用正则匹配 name: grafana-app-ingress spec: rules: - host: my-ingress-demo.com http: paths: - path: "/grafana/(.*)" # 用正则匹配所有子路径 backend: serviceName: grafana-demo-svc servicePort: grafana-svcport
3. 修正Helm安装Nginx Ingress的命令
你原来的命令里有个冲突的配置:--set controller.service.nodePorts.http=32080已经设置了HTTP的NodePort,后面的--set controller.service.nodePort=8080是多余的,会导致端口配置混乱,删掉它:
helm install stable/nginx-ingress --name r1 --set controller.service.nodePorts.http=32080 --set controller.service.type=NodePort --namespace default
4. Docker Compose环境的同步修复
同样的道理,Docker Compose里也要加上GF_SERVER_SERVE_FROM_SUB_PATH环境变量:
version: '3.3' services: grafana: image: "grafana/grafana" container_name: 'grafanaxxx' ports: - '3000:3000' environment: - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana/ - GF_SERVER_SERVE_FROM_SUB_PATH=true # 加上这个!
验证步骤
- 重新应用所有配置:
kubectl apply -f grafana-deployment.yaml kubectl apply -f grafana-service.yaml kubectl apply -f grafana-ingress.yaml - 确认Nginx Ingress的NodePort服务正常运行:
kubectl get svc r1-nginx-ingress-controller - 访问
http://my-ingress-demo.com:32080/grafana/,应该能正常看到Grafana登录界面了。
为什么之前会出问题?
- 没有设置
GF_SERVER_SERVE_FROM_SUB_PATH=true时,Grafana会把所有静态资源(CSS/JS/图标)的请求路径写成根路径/,而不是/grafana/,浏览器请求这些资源时就会返回404。 - 重写规则没配置或者写错时,Nginx会把
/grafana/的请求原封不动发给Grafana,Grafana找不到对应路径就返回404;如果重写规则错误(比如没加正则),又会导致循环重定向。
内容的提问来源于stack exchange,提问作者Nifty Hoot
相关产品推荐
相关产品推荐

