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

如何为Docker容器内HAProxy反向代理后的GitLab配置Let's Encrypt证书

反向代理后GitLab启用Let's Encrypt失败解决方案

错误根因

报错显示Let's Encrypt的HTTP-01域名验证请求超时,核心原因是HAProxy反向代理的架构下,GitLab默认的内置Let's Encrypt配置没有适配代理场景,公网的验证请求无法正确到达GitLab的acme挑战响应服务。

推荐方案:证书统一在HAProxy层管理(架构更清晰,维护成本更低)

  1. 修改GitLab核心配置,关闭内置SSL和内置证书签发功能
    编辑GitLab配置文件/etc/gitlab/gitlab.rb,修改对应配置项:

    # 关闭GitLab内置的Let's Encrypt自动签发功能
    letsencrypt['enable'] = false
    # 配置外部访问的域名,注意开头为https
    external_url 'https://domain.com'
    # 配置GitLab Nginx监听80端口,不处理HTTPS
    nginx['listen_port'] = 80
    nginx['listen_https'] = false
    # 配置信任反向代理的请求头,避免GitLab识别协议错误
    nginx['proxy_set_headers'] = {
      "X-Forwarded-Proto" => "https",
      "X-Forwarded-Ssl" => "on"
    }
    

    修改完成后执行gitlab-ctl reconfigure让配置生效。

  2. 配置HAProxy层证书签发与转发
    在HAProxy所在服务器安装certbot等证书管理工具,直接为你的域名申请Let's Encrypt证书,配置HAProxy规则:

    • 开放80端口,放行所有/.well-known/acme-challenge/前缀的请求用于证书验证
    • 443端口绑定已签发的SSL证书,将所有HTTPS请求转发到GitLab的80端口即可

可选方案:保留GitLab内置证书签发功能

如果需要让GitLab自己管理证书,按以下规则调整配置:

  1. HAProxy配置调整:80端口的所有请求(尤其是/.well-known/acme-challenge/前缀的请求)必须直接转发到GitLab的80端口,不要强制跳转HTTPS,不要添加访问控制、限速规则
  2. 修改GitLab配置文件/etc/gitlab/gitlab.rb:
    external_url 'https://domain.com'
    letsencrypt['enable'] = true
    letsencrypt['auto_renew'] = true
    # 信任HAProxy的内网IP,避免IP识别错误
    nginx['real_ip_trusted_addresses'] = ['替换为HAProxy的内网IP/32']
    nginx['real_ip_header'] = 'X-Forwarded-For'
    nginx['real_ip_recursive'] = 'on'
    
    调整完成后执行gitlab-ctl reconfigure,重新触发证书申请即可。

必做校验项

  • 你的域名必须正确解析到HAProxy的公网IP
  • HAProxy所在服务器的防火墙、云服务商安全组必须开放80端口的公网入站权限,Let's Encrypt的HTTP-01验证必须通过80端口完成
  • 不要给/.well-known/路径添加任何访问限制规则

内容的提问来源于stack exchange,提问作者andreas.teich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:48:03