改DNS能立刻缓解Composer卡顿,因其80%问题源于DNS解析失败或超时;需替换为可信DNS(如114.114.114.114、223.5.5.5),禁用systemd-resolved,锁定/etc/resolv.conf,预置hosts关键域名IP,并禁用IPv6 fallback。

为什么改DNS能立刻缓解Composer卡顿
Composer卡在Loading composer repositories或Downloading https://...,80%不是它慢,而是虚拟机/容器里DNS解析失败或超时。系统默认用宿主机DNS(比如192.168.1.1),但该地址常被劫持、响应慢,甚至返回错误IP,导致后续TLS握手直接卡死——改DNS是最轻量、见效最快的破局点。
/etc/resolv.conf只留两个可信DNS
别让systemd-resolved偷偷覆盖它,也别加一堆备用DNS拖慢查询顺序:
- 运行
sudo systemctl disable --now systemd-resolved(Ubuntu/Debian/CentOS 8+) - 编辑
/etc/resolv.conf,只保留两行:nameserver 114.114.114.114 nameserver 223.5.5.5
- 加
chattr +i /etc/resolv.conf防意外覆盖(重启后需chattr -i才能改)
hosts预置关键域名IP,跳过DNS查询
DNS改了还不够:有些镜像站(如mirrors.aliyun.com)会动态调度IP,但Composer首次请求前不走HTTP重定向,直接连IP。若DNS刚生效但本地缓存未刷新,仍可能查到旧IP或失败。硬写/etc/hosts是兜底方案:
- 先用
curl -I https://mirrors.aliyun.com/composer/确认当前响应IP(比如223.6.6.6) - 往
/etc/hosts追加:223.6.6.6 mirrors.aliyun.com 223.6.6.6 packagist.org 223.6.6.6 github.com 223.6.6.6 githubusercontent.com
- 注意:IP必须和你curl实测一致,不能抄网上的“通用IP”——阿里云CDN节点经常轮换
Docker容器内DNS要单独指定
容器默认继承宿主机/etc/resolv.conf,但Docker daemon可能注入127.0.0.11(内部DNS),而这个地址在某些网络环境下不可达:
- 启动时显式指定:
docker run --dns 114.114.114.114 --dns 223.5.5.5 php:8.3-cli composer install - 或全局配置:编辑
/etc/docker/daemon.json,加入"dns": ["114.114.114.114", "223.5.5.5"],再sudo systemctl restart docker - 验证是否生效:
docker run --rm alpine cat /etc/resolv.conf,输出必须是你指定的DNS,不能含127.0.0.11
真正容易被忽略的是IPv6 fallback:即使DNS和hosts都对了,Composer仍可能先尝试packagist.org的IPv6地址,超时3秒后再切IPv4——上百个包叠加就是几分钟无响应。验证方法:curl -v https://packagist.org 2>&1 | grep "Connected to",看到IPv6地址且卡住,就得关掉它:sysctl -w net.ipv6.conf.all.disable_ipv6=1(临时)或写入/etc/sysctl.conf(永久)。


















