配置重加载异常:
There was an error running gitlab-ctl reconfigure: letsencrypt_certificate[192.168.109.110] (letsencrypt::http_authorization line 3) had an error: Faraday::ConnectionFailed: acme_certificate[staging] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 20) had an error: Faraday::ConnectionFailed: Failed to open TCP connection to acme-staging.api.letsencrypt.org:443 (getaddrinfo: Name or service not known)
这个错误的核心原因是 GitLab 服务器无法解析 Let's Encrypt 的 ACME 服务器域名 (acme-staging.api.letsencrypt.org),导致无法建立 HTTPS 连接申请证书。以下是分步排查和解决方案:
一、先明确关键前提(避免无效操作)
Let's Encrypt 证书仅支持公网可访问的域名 (如 gitlab.yourdomain.com),不支持内网 IP(如 192.168.109.110)!如果你的 GitLab 仅部署在内网、没有公网域名和公网访问权限,无法使用 Let's Encrypt 自动签发证书,建议直接跳过 Let's Encrypt 配置,改用自签名证书或内网 CA 证书(后续会补充方案)。
二、若有公网域名和公网访问权限(解决 DNS 解析问题)
错误本质是服务器 DNS 解析失败,按以下步骤排查:
1. 测试服务器是否能解析 Let's Encrypt 域名
登录 GitLab 服务器,执行以下命令测试 DNS 解析:
bash
运行
# 测试解析 Let's Encrypt staging 服务器(错误中提到的域名)
nslookup acme-staging.api.letsencrypt.org
# 测试解析 Let's Encrypt 生产服务器(正式环境用)
nslookup acme-v02.api.letsencrypt.org
# 测试公网连通性(如百度),排除服务器断网
nslookup www.baidu.com
- 若输出
Name or service not known:说明 DNS 配置有问题,进入步骤 2。 - 若能正常解析(返回 IP 地址):进入步骤 3 测试网络连通性。
2. 修复 DNS 配置(核心解决步骤)
服务器无法解析域名,通常是 /etc/resolv.conf 中 DNS 服务器配置错误或不可用。
方法 1:临时更换 DNS 测试(立即生效,重启后失效)
bash
运行
# 编辑 resolv.conf,添加公共 DNS(如 8.8.8.8 或 114.114.114.114)
sudo vi /etc/resolv.conf
# 添加以下内容(替换原有 nameserver 行)
nameserver 8.8.8.8 # Google DNS
nameserver 114.114.114.114 # 国内 DNS
方法 2:永久修改 DNS(推荐,避免重启失效)
不同系统修改方式不同,以主流系统为例:
-
Ubuntu/Debian :编辑网络配置文件(以
eth0网卡为例,根据实际网卡名修改):sudo vi /etc/network/interfaces在网卡配置中添加 DNS:
iface eth0 inet static # 原有 IP、网关等配置不变 dns-nameservers 8.8.8.8 114.114.114.114重启网络:
sudo systemctl restart networking -
CentOS/RHEL :编辑网卡配置文件(以
ens33为例):sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33添加 / 修改 DNS 配置:
DNS1=8.8.8.8 DNS2=114.114.114.114重启网络:
sudo systemctl restart network
验证 DNS 修复
修改后重新执行 nslookup acme-staging.api.letsencrypt.org,若能返回 IP(如下)则说明 DNS 已修复:
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
acme-staging.api.letsencrypt.org canonical name = staging.api.letsencrypt.org.
staging.api.letsencrypt.org canonical name = prod.api.letsencrypt.org.edgesuite.net.
prod.api.letsencrypt.org.edgesuite.net canonical name = e1767.dscb.akamaiedge.net.
Name: e1767.dscb.akamaiedge.net
Address: 23.36.77.114
3. 测试 443 端口连通性(排除防火墙 / 网络限制)
DNS 修复后,若仍报错,可能是服务器防火墙或网关限制了 443 端口(Let's Encrypt 需通过 443 通信):
# 测试 TCP 连接 443 端口
telnet acme-staging.api.letsencrypt.org 443
# 或用 curl 测试(更直观)
curl -v https://acme-staging.api.letsencrypt.org
-
若输出
Connected to acme-staging.api.letsencrypt.org或 curl 返回HTTP/1.1 200 OK:说明网络连通正常。 -
若超时 / 拒绝连接:需开放 443 出站端口(Let's Encrypt 仅需服务器主动访问公网 443,无需公网访问服务器 443):
# CentOS/RHEL 开放 443 出站(firewalld) sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reload # Ubuntu/Debian 开放 443 出站(ufw) sudo ufw allow out 443/tcp若服务器在云环境(如阿里云、AWS),还需检查安全组规则,允许 443 出站流量。
4. 重新执行 gitlab-ctl reconfigure
修复 DNS 和网络后,重新运行配置命令:
sudo gitlab-ctl reconfigure
若仍报错,可能是 Let's Encrypt 配置有误(如域名未指向服务器公网 IP),需检查 gitlab.rb 中的 Let's Encrypt 配置:
sudo vi /etc/gitlab/gitlab.rb
确保配置正确(替换为你的公网域名):
# 禁用内置 NGINX 的自动 HTTPS(由 Let's Encrypt 管理)
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{external_url_host}.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{external_url_host}.key"
# Let's Encrypt 配置(必须用公网域名,不能用 IP)
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['your-email@example.com'] # 接收证书过期通知
letsencrypt['domain'] = 'gitlab.yourdomain.com' # 你的公网域名(需解析到服务器公网 IP)
letsencrypt['auto_renew'] = true
修改后执行 sudo gitlab-ctl reconfigure 生效。
三、若为内网环境(无公网域名 / 访问权限):跳过 Let's Encrypt
内网 GitLab 无法使用 Let's Encrypt,建议用以下方案替代:
方案 1:使用自签名证书
-
生成自签名证书(替换为你的内网域名或 IP):
sudo mkdir -p /etc/gitlab/ssl sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/gitlab/ssl/gitlab.key \ -out /etc/gitlab/ssl/gitlab.crt执行时按提示填写信息(Common Name 填内网域名或 IP,如
192.168.109.110)。 -
配置 GitLab 使用自签名证书:
sudo vi /etc/gitlab/gitlab.rb添加以下配置(注释掉原有 Let's Encrypt 相关配置):
external_url 'https://192.168.109.110' # 内网 HTTPS 地址 nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key" nginx['redirect_http_to_https'] = true # HTTP 重定向到 HTTPS -
重新配置 GitLab:
sudo gitlab-ctl reconfigure
方案 2:使用内网 CA 证书(推荐企业内网)
若企业有内部 CA 服务器,可申请内网可信证书,配置方式与自签名证书一致(仅替换 gitlab.crt 和 gitlab.key 为 CA 签发的证书即可),客户端无需忽略证书警告。
总结
- 若用 Let's Encrypt:必须有公网域名 + 公网访问权限,先修复 DNS 解析(更换公共 DNS),再开放 443 出站端口,最后重新配置。
- 若为内网环境:直接放弃 Let's Encrypt,使用自签名证书或内网 CA 证书,配置步骤更简单且稳定。
按以上步骤操作后,gitlab-ctl reconfigure 即可正常执行。