composer不支持geo路由,需通过反向代理+地理感知负载均衡实现智能路由:统一入口域名后接区域化后端,中国节点用阿里云镜像,海外节点直连packagist并启用ipv4,lb须tls终止与http缓存。

Composer 本身不支持 GEO 路由,硬配单个镜像源必翻车
直接执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 对跨国团队无效——中国节点能连通,新加坡或法兰克福节点大概率卡在 Loading composer repositories,不是网络不通,而是回源绕路、CDN 未覆盖、证书链缺失导致 TLS 握手失败。Composer 2.x 默认启用 secure-http,而小内存 Alpine 容器或旧版 OpenVZ 常缺 ca-certificates,curl -I https://packagist.org/packages.json 若报 SSL certificate problem (60) 就坐实了这点。
必须用反向代理 + 地理感知 LB 实现“智能路由”
可行路径只有一条:部署统一入口域名(如 https://composer.mirror.internal),背后挂多个区域化后端,并由负载均衡器按请求 IP 的地理位置分发流量。关键点:
- 后端需差异化配置:中国节点接
cn-mirror.internal(阿里云镜像),海外节点接us-mirror.internal(直连 packagist.org +COMPOSER_IPV4=1避免 IPv6 超时) - LB 必须做 TLS 终止和 HTTP 缓存,不能只做 DNS 轮询——DNS 不感知客户端真实出口 IP
- 所有机器只配这一个 URL:
composer config -g repo.packagist composer https://composer.mirror.internal - 别指望
repositories数组 fallback:Composer 只认第一个生效的packagist键,超时或 500 不会自动切下一个
常见翻车点:Nginx 反代 packagist.org 不等于镜像站
直接用 Nginx proxy_pass https://packagist.org 并填进 repo.packagist,结果是 404 或空响应。原因很实在:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- packagist.org 的 CDN 和动态路由不允许跨域直连,简单反代无法复现其签名逻辑和缓存策略
- 镜像 URL 漏掉末尾
/(如写成https://your-mirror),Composer 内部拼出https://your-mirrorpackages.json→ 404 -
http-proxy和https-proxy是真代理,但不改写目标地址——它不会帮你把对内网镜像的请求再转发出去 - 若镜像站用自签名证书,必须配
composer config -g secure-http false,否则卡在 cURL error 60
真正按需缓存的方案只能自己搭中间服务
如果需要“请求进来 → 判缓存 → 无则外网拉 → 存一份再返回”,这不是 Composer 的职责,得靠中间服务:
-
Satis:静态生成 JSON + ZIP,适合离线或低频更新;必须提前运行php bin/satis build satis.json web/把所有递归依赖(含require-dev)全拉下来,否则composer install仍会直连外网 -
Private Packagist或Artifactory:支持动态代理+缓存+权限控制,但需商业许可或较高运维成本 - 别碰
phpcomposer.com:2025 年底起大量包返回 404,已停更
最易被忽略的是:所有区域化后端必须独立维护证书链、HTTP 缓存头和响应体完整性,否则 LB 分发过去后,某个区域节点拿到的 packages.json 缺字段或签名失效,整个 Composer 解析就会静默失败——连错误日志都未必出现。










