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

Traefik 2.x与GitLab Docker配置访问返回404问题排查

问题分析与解决方案

一、配置中的明显错误

1. GitLab Compose配置的YAML语法错误

你的GitLab docker-compose.yml里重复定义了labels:字段:

labels:
    labels:
      - "traefik.enable=true"
      ...

这会导致第一个空的labels:覆盖后续配置,Traefik无法读取到GitLab的路由规则,直接引发404。必须删掉其中一个labels:行,修正后如下:

labels:
      - "traefik.enable=true"
      - "traefik.http.routers.gitlab.rule=Host(`gitlab.skull-music.com`)"
      - "traefik.http.routers.gitlab.entrypoints=https"
      - "traefik.http.routers.gitlab.tls=true"
      - "traefik.http.routers.gitlab.service=gitlab-main"
      - "traefik.http.services.gitlab-main.loadbalancer.server.port=80"
      - "traefik.http.routers.gitlab.tls.certResolver=le"

2. GitLab内部端口与反向代理适配问题

当你设置external_url 'https://gitlab.skull-music.com'时,GitLab会默认让内部Nginx监听443端口,但Traefik现在是转发到容器的80端口,这会导致GitLab内部服务不响应80端口的请求。需要在GITLAB_OMNIBUS_CONFIG中添加反向代理相关配置,告诉GitLab请求来自HTTPS反向代理,且内部监听80端口:

environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.skull-music.com'
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }

二、进一步调试步骤

1. 检查Traefik仪表盘的路由状态

访问http://你的服务器IP:8080(Traefik的API界面),查看Routers和Services标签页:

  • 确认gitlab路由器是否存在,且状态为enabled
  • 确认gitlab-main服务是否关联到正确的容器和端口

如果看不到这两个条目,说明Traefik没有读取到GitLab的标签配置,大概率是YAML语法错误或网络问题。

2. 验证容器间的网络连通性

在Traefik容器内测试能否访问GitLab容器的80端口:

# 进入Traefik容器
docker exec -it traefik bash

# 安装curl(如果没有的话)
apt update && apt install -y curl

# 访问GitLab容器的80端口,替换gitlab-main为容器名或IP
curl http://gitlab-main:80

如果返回GitLab的HTML内容,说明网络连通正常;如果超时或拒绝连接,检查网络配置是否正确(确认两个容器都在traefik_web网络中)。

3. 查看Traefik的调试日志

重启Traefik时开启调试日志,获取更详细的路由匹配信息:
修改Traefik的command添加--log.level=DEBUG:

command:
  - "--api.insecure=true"
  - "--providers.docker"
  - "--providers.docker.exposedByDefault=false"
  - "--providers.docker.network=traefik_web"
  - "--entrypoints.http.address=:80"
  - "--entrypoints.http.http.redirections.entrypoint.to=https"
  - "--entrypoints.http.http.redirections.entrypoint.scheme=https"
  - "--entrypoints.https.address=:443"
  - "--entrypoints.https.http.tls.certResolver=le"
  - "--certificatesresolvers.le.acme.tlschallenge=true"
  - "--certificatesresolvers.le.acme.email=deine@mail.de"
  - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
  - "--log.level=DEBUG"

然后查看Traefik日志:

docker logs -f traefik

搜索gitlab或Host(gitlab.skull-music.com),看是否有路由匹配的记录,或者标签加载失败的提示。

4. 检查GitLab容器日志

查看GitLab的Nginx访问日志,确认是否收到Traefik的请求:

docker logs -f gitlab | grep nginx

如果没有任何请求记录,说明Traefik的转发没有到达GitLab;如果有4xx/5xx状态码,根据日志信息调整GitLab配置。


内容的提问来源于stack exchange,提问作者sebastian kull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:47:48