Composer 私有仓库访问慢或失败的主因是 DNS 解析问题,需通过修改 /etc/hosts、禁用 systemd-resolved 或配置内网 DNS 来解决,而非调整 Composer 配置本身。

Composer 本身不处理 DNS 解析,所谓“绑定私有 DNS”其实是优化其底层网络请求(curl / file_get_contents)所依赖的系统级 DNS 查找路径。真正要改的是虚拟机或容器里的 /etc/resolv.conf、/etc/hosts,以及可能干扰解析的 systemd-resolved。
为什么改 DNS 能让 Composer 私有仓库快起来
私有仓库域名(如 satis.internal、repo.company.com)若走默认 DNS,常因内网 DNS 未配置、递归超时、或被宿主机劫持而解析失败或延迟。Composer 卡在 Loading repository 或报 Could not resolve host,90% 是 DNS 层没通,不是源地址写错了。
- 内网 DNS 服务器未在虚拟机中显式配置,导致 fallback 到公网 DNS(查不到私有域名)
- 宿主机启用了
systemd-resolved,会偷偷覆盖/etc/resolv.conf,且不转发私有域请求 - 公司 DNS 不支持 DNSSEC 或做了 TCP 截断,而 Composer 默认用 UDP 查询
手动写死私有域名到 /etc/hosts 最稳
对已知固定 IP 的私有仓库,直接在 /etc/hosts 中映射,完全绕过 DNS 查询。这是最简单、最可靠、零配置依赖的方式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认私有仓库地址能否访问:
curl -I https://satis.internal/,看返回 IP 和状态码 - 编辑
/etc/hosts,加一行:10.20.30.40 satis.internal(IP 必须准确,不能是 127.0.0.1) - 别加
www.前缀或端口——satis.internal:8080这种写法无效,hosts 只管域名部分 - 验证是否生效:
getent hosts satis.internal或ping -c1 satis.internal
禁用 systemd-resolved + 锁死 resolv.conf
Ubuntu/CentOS 8+ 默认启用 systemd-resolved,它会把 /etc/resolv.conf 指向自己的 stub 地址(127.0.0.53),再转发请求——但这个 stub 对私有域名转发不可靠,且容易静默失败。
- 停用并屏蔽:
sudo systemctl disable --now systemd-resolved - 删掉符号链接:
sudo rm /etc/resolv.conf - 新建纯文本:
echo "nameserver 10.20.30.1" | sudo tee /etc/resolv.conf(填你内网 DNS IP) - 加只读保护防覆盖:
sudo chattr +i /etc/resolv.conf(需要时再chattr -i)
验证 Composer 是否真用上了私有 DNS
光改系统配置不够,得确认 Composer 请求发出去时用的是哪个 DNS、连的是哪个 IP。关键看日志和抓包。
- 加
-vvv运行:composer install -vvv 2>&1 | grep -E "(Resolving|Connecting to)",看到Resolving satis.internal就说明域名已识别 - 如果还显示
Could not resolve host,立刻检查/etc/hosts拼写、IP 是否可 ping、resolv.conf是否被覆盖 - 进容器或虚拟机执行:
nslookup satis.internal,输出应为你的内网 IP;若超时或返回 public IP,说明 DNS 配置没生效 - 极端情况需抓包确认:
sudo tcpdump -i any port 53 and host satis.internal -w dns.pcap,看查询是否发往预期 DNS
真正卡住的地方往往不是 Composer 配置本身,而是你改了 composer.json 里的 repositories,却忘了虚拟机里连 satis.internal 这个名字都解析不出来——DNS 是第一道关,过了它,后面才轮得到 type 是 composer 还是 vcs、URL 有没有结尾斜杠这些细节。

















