Composer 本身不产生流量费用,但私有仓库部署在按流量计费的云主机且未限流或缓存时,会因 CI/CD 高频拉取或开发机直连触发高额出网流量费。

Composer 本身不产生任何流量计费——所有下载行为都走你本地机器或构建服务器的网络出口,阿里云、腾讯云等平台的「容器镜像服务」或「TCR」也**不为 Composer 的 composer install 或 composer update 流量埋单**。真正要盯紧成本的,是背后那套「镜像源代理/缓存系统」是否被误当成公网 CDN 使用。
为什么 composer install 看似没收费,但团队账单却突然上涨?
常见诱因是把私有 Composer 仓库(如 Satis、Private Packagist、或自建 Nginx + Artifactory)部署在了按流量计费的云主机上,且未限制访问来源或开启缓存策略。一旦 CI/CD 流水线高频拉取、或开发机直连公网地址,就会触发云厂商的「出网流量」计费。
- 阿里云轻量应用服务器:每月固定流量用完后,超额部分按
0.8 元/GB(中国内地)计费 - 腾讯云 CVM:若未绑定弹性公网 IP 或未配置 NAT 网关限流,
curl https://your-satis.example.com这类请求全部算作公网出方向流量 - 自建镜像服务若托管在 ECS 上,且使用了「按固定带宽」以外的「按使用流量」计费模式,
composer install每次下载 ZIP 包都会叠加计费
composer config --global repos.packagist.org 配置错一次,可能多花几百块
全局镜像源配置写成公网可访问地址(比如直接填 https://packagist.example.com),而该域名解析到一台按量付费的轻量服务器,就等于给所有开发者发了一张「无限流量卡」。更隐蔽的是,某些团队会用 GitHub Pages 或 Vercel 托管 Satis 页面,但忘记屏蔽 /dist/ 目录的 ZIP 下载入口——这些静态托管平台对大文件下载通常不设限,费用直接体现在对象存储的流出流量上。
- 正确做法:将
repos.packagist.org指向内网地址(如http://10.0.1.100:8080),CI/CD 节点通过 VPC 内网访问 - 若必须走公网,务必在反向代理层(Nginx / Cloudflare)启用
Cache-Control: public, max-age=3600,并禁止未授权 UA 访问/dist/ - 检查
composer.json中是否有硬编码的"url": "https://xxx",这类字段会绕过全局镜像配置,直接发起外部请求
镜像缓存 ≠ 免费,composer cache 目录位置决定磁盘成本
Composer 默认缓存路径(~/.composer/cache)如果落在云盘容量小、IOPS 低的实例上,频繁解压 ZIP 包会导致磁盘 IO 瓶颈,间接推高构建耗时和资源占用;而若人为改到 NAS 或 OSSFS 挂载点,则可能触发额外的「请求次数费」或「小文件读写费」。
- 轻量应用服务器默认系统盘仅 40–100 GiB,
composer cache占满后会导致df -h报错,CI 失败 - 阿里云 NAS 容量型(Performance)按
0.0002 元/GB/小时计费,但每万次读写请求另收0.01 元,一个composer install可能触发数千次小文件读取 - 推荐方案:在构建节点本地挂载 SSD 云盘(如 ESSD PL1),设置
COMPOSER_CACHE_DIR=/mnt/ssd/composer-cache,避免跨网络读写
最易被忽略的一点:很多团队以为「用了国内镜像站」就安全了,但没意识到 packagist.phpcomposer.com、mirrors.huaweicloud.com 这些公共镜像本身不收费,可一旦你在公司内网做了二次代理并开放了公网访问,责任主体就从镜像站变成了你自己的服务器——流量归属以出口 IP 为准,不是以域名为准。


















