Docker+Traefik环境下Kibana访问404错误求助
你遇到的Kibana通过Traefik代理访问404的问题,主要源于Traefik路由配置的多处不匹配,以下是具体问题和修正方案:
核心配置错误点
1. Entrypoints名称不匹配
Traefik启动命令中定义的入口点是web(对应80端口)和websecure(对应443端口),但你的Kibana和Elasticsearch配置中使用了未定义的http作为entrypoints值,导致Traefik无法识别路由规则;同时Kibana的labels重复设置entrypoints(先写http再覆盖为websecure),如果未配置HTTPS证书,Traefik无法处理websecure请求,直接返回404。
2. Elasticsearch路由规则命名冲突
Elasticsearch的labels中,路由名称是elasticsearch,但规则配置写的是traefik.http.routers.elastic.rule,路由名称与规则key不匹配,这条规则不会生效——你能访问Elasticsearch应该是直接通过映射的9200端口,而非Traefik代理。
3. Traefik自身网络配置错误
Traefik的labels中指定了不存在的public网络,实际你的自定义网络是app-network,这会导致Traefik自身的dashboard路由异常,也可能影响服务发现。
4. BasePath配置不完整(若使用)
如果你尝试设置basePath但未开启路径重写,仅设置SERVER_BASEPATH是无效的,Kibana的静态资源路径不会被修正,同样会出现404。
修正后的关键配置片段
1. 修正Traefik的网络与基础配置
services: reverse-proxy: image: traefik:v2.5 command: --providers.docker.network=app-network --providers.docker.exposedByDefault=false --entrypoints.web.address=:80 --entrypoints.websecure.address=:443 --providers.docker=true --api=true --api.dashboard=true # 若需HTTPS,添加ACME证书解析器(需替换邮箱) # --certificatesresolvers.myresolver.acme.httpchallenge=true # --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web # --certificatesresolvers.myresolver.acme.email=your-email@example.com # --certificatesresolvers.myresolver.acme.storage=/certs/acme.json ports: - "80:80" - "443:443" networks: app-network: ipv4_address: xxx.xxx.xxx.xxx volumes: - /var/run/docker.sock:/var/run/docker.sock - /certs/:/certs labels: - traefik.enable=true - traefik.docker.network=app-network # 改为正确的自定义网络 - traefik.http.routers.traefik-http.entrypoints=web - traefik.http.routers.traefik-http.service=api@internal
2. 修正Elasticsearch的Traefik路由
elasticsearch: # ... 其他配置不变 labels: - "traefik.enable=true" - "traefik.http.routers.elasticsearch.entrypoints=web" # 使用正确的entrypoint名称 - "traefik.http.routers.elasticsearch.rule=Host(`elastic.mydomain.fr`)" # 路由名称与规则key一致 - "traefik.http.services.elasticsearch.loadbalancer.server.port=9200" # 服务名称与路由对应
3. 修正Kibana的Traefik路由(HTTP版)
kibana: # ... 其他配置不变 labels: - "traefik.enable=true" - "traefik.http.routers.kibana.entrypoints=web" # 统一使用web入口,避免重复配置 - "traefik.http.routers.kibana.rule=Host(`kibana.mydomain.fr`)" - "traefik.http.services.kibana.loadbalancer.server.port=5601"
4. 若需使用HTTPS的Kibana配置
在Kibana的labels中添加TLS配置:
labels: # ... 其他配置不变 - "traefik.http.routers.kibana.entrypoints=websecure" - "traefik.http.routers.kibana.tls.certresolver=myresolver" # 对应Traefik中配置的证书解析器名称
5. 完整BasePath配置(若需要)
如果必须通过子路径访问Kibana,需同时配置Kibana环境变量和Traefik中间件:
kibana: environment: ELASTICSEARCH_URL: http://elasticsearch:9200 ELASTICSEARCH_HOSTS: http://elasticsearch:9200 SERVER_BASEPATH: "/kibana" SERVER_REWRITEBASEPATH: "true" # 必须开启路径重写 labels: - "traefik.enable=true" - "traefik.http.routers.kibana.entrypoints=web" - "traefik.http.routers.kibana.rule=Host(`kibana.mydomain.fr`) && PathPrefix(`/kibana`)" - "traefik.http.middlewares.kibana-stripprefix.stripprefix.prefixes=/kibana" - "traefik.http.routers.kibana.middlewares=kibana-stripprefix" - "traefik.http.services.kibana.loadbalancer.server.port=5601"
验证步骤
- 停止并删除现有容器:
docker-compose down - 启动服务:
docker-compose up -d - 查看Traefik日志确认路由是否加载:
docker-compose logs reverse-proxy - 访问
http://kibana.mydomain.fr验证是否正常
内容的提问来源于stack exchange,提问作者Loot

