You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  # 加上这个!

验证步骤

  1. 重新应用所有配置:
    kubectl apply -f grafana-deployment.yaml
    kubectl apply -f grafana-service.yaml
    kubectl apply -f grafana-ingress.yaml
    
  2. 确认Nginx Ingress的NodePort服务正常运行:
    kubectl get svc r1-nginx-ingress-controller
    
  3. 访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:08:42