内网部署Composer镜像必须使用华为云镜像或自建服务,禁用公网镜像;华为云地址为https://mirrors.huaweicloud.com/repository/php/,配置需带结尾斜杠并验证JSON输出;自建需反向代理全部元数据路径、透传HTTP头、内网DNS解析,且须手动抽样验证响应体。

内网部署必须用华为云或自建镜像,不能直接复用公网镜像命令
公网镜像如阿里云、腾讯云地址(https://mirrors.aliyun.com/composer/)默认要求外网可达,内网服务器直连会失败。真正适合内网的只有两类:华为云镜像(支持内网穿透)和自建服务(如 packagist-mirror)。华为云地址是 https://mirrors.huaweicloud.com/repository/php/,注意它不是以 /composer/ 结尾,类型仍是 composer,但路径结构不同——填错就 404。
华为云镜像在内网的正确配置方式
它专为 NAT、代理、企业防火墙环境优化,不依赖公网 DNS 或 TLS 全链路验证:
-
composer config -g repo.packagist composer https://mirrors.huaweicloud.com/repository/php/—— URL 必须完整,结尾斜杠不能少 - 验证输出必须是 JSON:
composer config -g repo.packagist应返回{"type": "composer", "url": "https://mirrors.huaweicloud.com/repository/php/"} - 若在宝塔或 Docker 中使用,确保执行用户与 Web 进程一致,例如
sudo -u www composer config -g ... - 遇到
Package not found先查原包是否已被作者下架,该镜像不托管所有历史版本
自建镜像服务的关键组件与陷阱
用 packagist-mirror(PHP 实现)或 composer-proxy(Go 实现)可实现完全可控的内网同步,但需注意:
- 必须反向代理全部 Packagist 元数据路径:
/packages.json、/p2/*、/provider-*.json,漏掉任一路径都会导致composer install卡在 provider 请求 - HTTP 响应头必须透传
Last-Modified和ETag,否则 Composer 3.x+ 会拒绝缓存并反复拉取 - 不能只做静态文件同步——Packagist 是按需拉取,镜像服务必须能动态回源并缓存响应体
- 内网 DNS 需将
repo.packagist.org解析到你自建服务 IP,或强制改写 Composer 源码(不推荐)
验证内网镜像是否真生效的三步法
别信 composer diagnose,它不检测实际请求域名:
- 加
-vvv运行composer update,搜索日志中GET https://开头的 URL,确认域名是你的内网地址或mirrors.huaweicloud.com - 用
curl -I http://your-mirror-ip/packages.json测试是否返回 200 及正确Content-Type: application/json - 删掉本地
vendor/和composer.lock,重新composer install,观察是否跳过 “Loading composer repositories” 卡顿
内网镜像最常被忽略的一点:Composer 从不校验镜像内容完整性,只要 HTTP 返回 200 就认为同步成功。所以即使镜像服务返回了空 JSON 或格式错误的元数据,Composer 也不会报错,只会后续安装失败——务必手动抽样验证几个 p2/ 路径的实际响应体。


















