私有云中parallel-downloads=15变慢主因是Ingress限流:limit-connections默认10、limit-rps误启、proxy-read-timeout过短;需调至50、0、600并开启proxy-buffering,同时规避CI/CD干扰项与镜像配置失效问题。

为什么parallel-downloads=15在私有云里反而更慢
不是镜像站带宽不够,而是Ingress控制器默认策略把并发请求堵死了。Composer发起大量短连接到mirrors.example.com,但nginx.ingress.kubernetes.io/limit-connections默认值常为10,多余请求排队;nginx.ingress.kubernetes.io/limit-rps若误启用,会把下载当API限速;proxy-read-timeout太短(如60秒)导致大tarball中途断连。
-
nginx.ingress.kubernetes.io/limit-connections: "50"——别设"0",某些Ingress版本不支持无限制 -
nginx.ingress.kubernetes.io/limit-rps: "0"——必须显式关掉,不能留空 -
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"——防止30MB以上dist包下载超时 -
nginx.ingress.kubernetes.io/proxy-buffering: "on"——避免后端小块写触发频繁flush,拖慢吞吐
composer install卡在Downloading的本质是QPS被限,不是带宽瓶颈
阿里云、腾讯云、清华镜像普遍对单IP设60次/分钟硬上限,CI节点批量构建瞬间触发429 Too Many Requests或静默丢包。日志里反复出现curl: (28) Operation timed out就是信号。Composer不会自动降级——某个包卡住300秒超时,其余并发全得排队等它结束。
- 全局设低并发:
composer config -g repos.packagist.org.concurrent-downloads 2(注意键名,不是http-max-concurrent-downloads) - 项目
composer.json里至少配3个国内镜像,每个都加"canonical": false,否则只认第一个 -
composer clear-cache必须紧跟换源操作,否则旧packages.json仍走packagist.org - 验证URL结尾是否有
/,缺了会导致拼接/dists/出404
哪些操作会让镜像配置“看似生效实则失效”
换了源但composer install -vvv日志里仍看到repo.packagist.org,大概率是以下情况之一:
- 项目
composer.json里定义了repositories但没加"packagist.org": false,Composer fallback回官方源拉provider元数据 - 包的
composer.json硬编码了"dist": {"url": "https://github.com/..."},完全绕过镜像逻辑 - 用了已停更的源(如
https://packagist.phpcomposer.com),返回404但Composer不报错,只重试直到超时 - 新发布的包尚未同步到镜像(通常延迟5–30分钟),
composer show vendor/name -vvv会暴露真实请求地址
CI/CD中必须关闭的三个干扰项
开发环境有用的参数,在构建阶段全是性能杀手:
-
--no-dev:跳过require-dev包,避免测试类污染autoload classmap -
--no-scripts:禁用post-install-cmd等钩子,防止意外触发npm install或DB清理 -
--no-autoloader:不生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补
漏掉任意一个,composer install都可能多花30%–60%时间。别信“看起来快一点”,要盯-vvv日志里是否真有多个Downloading https://行交错出现——这才是并发生效的唯一证据。


















