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

