GitLab Docker实例外部URL配置异常:设置后出现重定向错误
GitLab配置后出现重定向循环问题排查
问题背景
通过Docker启动GitLab容器,搭配Nginx反向代理实现HTTPS访问。初始状态下可通过https://MY_URL.com正常访问,但仓库克隆链接显示为HTTP,且CI任务使用HTTP地址时出现基础认证错误。添加external_url 'https://MY_URL.com'并重新配置GitLab后,访问HTTP/HTTPS地址均出现“错误重定向”,Nginx日志仅显示301状态码。
现有配置信息
Docker启动命令
sudo docker run --detach --hostname MY_URL.com --publish 4433:443 --publish 8080:80 --publish 2222:22 --name gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
Nginx反向代理配置
server { server_name MY_URL.com; location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $http_host; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwardedd_for; proxy_set_header X-Forwarded_Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/MY_URL.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/MY_URL.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = MY_URL.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name MY_URL.com; return 404; # managed by Certbot }
GitLab配置修改
编辑/data/gitlab/config/gitlab.rb,添加:
external_url 'https://MY_URL.com'
执行重新配置命令:
sudo docker exec -it gitlab gitlab-ctl reconfigure
错误原因分析
- Nginx配置拼写错误:
X-Forwarded-For头的变量拼写错误($proxy_add_x_forwardedd_for多了一个d),导致GitLab无法正确获取客户端真实IP及转发协议信息。 - GitLab内部Nginx冲突:设置
external_url为HTTPS后,GitLab内置Nginx默认会强制跳转至HTTPS,但反向代理已将HTTPS请求转换为HTTP转发给容器内的80端口,形成重定向循环。
解决步骤
1. 修复Nginx配置错误
将Nginx配置中的proxy_set_header X-Forwarded-For $proxy_add_x_forwardedd_for;修改为:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2. 完善GitLab反向代理配置
在/data/gitlab/config/gitlab.rb中添加以下配置,告知GitLab运行在反向代理之后,信任转发头并关闭内部HTTPS监听:
external_url 'https://MY_URL.com' # 让GitLab内置Nginx监听80端口(HTTP),关闭HTTPS监听 nginx['listen_port'] = 80 nginx['listen_https'] = false # 配置转发头,确认外部协议为HTTPS nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "https", "X-Forwarded-Ssl" => "on" } # 信任反向代理的IP(此处为本地127.0.0.1,若反向代理在其他机器需修改) gitlab_rails['trusted_proxies'] = ['127.0.0.1']
3. 重新配置GitLab并重启服务
执行GitLab重新配置命令:
sudo docker exec -it gitlab gitlab-ctl reconfigure
重启Nginx生效配置:
sudo systemctl restart nginx
验证结果
完成上述配置后,访问https://MY_URL.com可正常进入GitLab,仓库克隆链接将显示为HTTPS地址,CI任务使用HTTPS地址时的认证错误也会解决。
内容的提问来源于stack exchange,提问作者djcaesar9114
相关产品推荐
相关产品推荐

