安全组放行需同时覆盖镜像域名与api.github.com等包源的出向443端口,且华为云/腾讯云镜像url路径必须严格匹配,多用户环境须确保配置作用于实际执行用户,并启用signature验证防投毒。

安全组放行只影响元数据请求,不影响包文件下载
Composer 镜像源配置本身不涉及端口开放,但安全组规则会决定 packages.json 等元数据能否拉下来。关键点是:镜像只代理元数据(packages.json、provider-*.json),而实际的 .zip/.tar 包仍从官方或 GitHub 直连——所以你得同时放行两路流量。
常见错误是只开了镜像域名的 443,却忘了 api.github.com 或 packagist.org 的出向连接。结果现象是:Loading composer repositories 成功,但卡在 Downloading xxx.zip,日志里出现 cURL error 7 或 Connection refused。
- 必须放行出向 HTTPS(443)到镜像域名:如
mirrors.aliyun.com、mirrors.cloud.tencent.com - 必须放行出向 HTTPS(443)到
api.github.com(绝大多数包 dist URL 指向它) - 若项目含私有 VCS 包(如 GitLab 自建仓库),还需额外放行对应域名和端口(如
gitlab.example.com:22或https://gitlab.example.com) - 不要试图封禁
packagist.org入站——它不接收入站请求;但出向可不限制,因镜像生效后 Composer 不再主动访问它
华为云/腾讯云安全组下镜像 URL 必须严格匹配路径
华为云和腾讯云镜像不是简单换域名,路径结构不同,安全组规则必须按实际请求 URL 设置白名单,否则 404 后静默 fallback 到官方源——你根本看不到报错。
例如,华为云镜像地址是 https://mirrors.huaweicloud.com/repository/php/,少一个 /php/ 就会拼出 /repository/packages.json,返回 404;多加一个 /(变成 /repository/php//packages.json)则触发 cURL error 60(SSL 证书不匹配)。这两类错误都会让 Composer 放弃该镜像,自动切回 packagist.org。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 腾讯云镜像:只认
https://mirrors.cloud.tencent.com/composer/(末尾单斜杠,路径不含/repository/) - 华为云镜像:只认
https://mirrors.huaweicloud.com/repository/php/(路径含/repository/php/,末尾单斜杠) - 阿里云最宽松:只校验
https://mirrors.aliyun.com/composer/,但少斜杠仍会拼错成/composerpackages.json→ 404 - 安全组白名单应填完整域名 + 路径前缀,如
mirrors.huaweicloud.com/repository/php/(部分云平台支持路径级匹配)
多用户容器环境(Docker/宝塔)下安全组与配置需双重对齐
你在宿主机配好安全组,不代表容器内能用镜像——因为 Docker 默认 NAT 出向,走的是宿主机网络栈;而宝塔网站进程以 www 用户运行,读的是 /home/www/.composer/config.json,不是你终端里 root 配的全局配置。
典型故障链:安全组开了,composer config -g repo.packagist 返回正确 JSON,但 composer install -vvv 日志里还是出现 packagist.org。原因就是 PHP 进程根本没读到那条配置。
- 确认真实执行用户:进网站根目录跑
whoami,或查宝塔日志里的UID=,或docker exec -it xxx ps aux | grep php - 针对性配镜像:
sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(缺sudo -u就又写进root家目录) - Docker 构建时,别依赖
composer config -g:改用COPY预置的/etc/composer/config.json(系统级配置,所有用户生效) - CI 场景(如 GitHub Actions)直接放弃全局配置,改用项目级:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/并提交composer.json
安全组 + 镜像 + 签名验证三者必须协同才真正防投毒
只开安全组、只换镜像,不启用签名验证,等于把门锁了却把钥匙扔在地上。国内主流镜像(阿里云/腾讯云/华为云)均不提供 signature 字段,一旦你用 composer config -g repo.packagist 完全替换官方源,Composer 就会跳过包完整性校验。
真正安全的做法是:保留 packagist.org 作为唯一可信源,仅将元数据请求代理到镜像,同时强制启用签名验证。这要求安全组必须允许出向到 packagist.org(用于最终校验),而不仅仅是镜像站。
- 启用签名验证:
composer config -g security.signature true - 设置可信镜像(仅元数据):
composer config -g repos.packagist.type composer+composer config -g repos.packagist.url https://mirrors.aliyun.com/composer/ - 确保未禁用 HTTPS:
composer config -g secure-http true(默认开启,但检查下更稳) - 验证是否生效:
composer diagnose输出中必须同时出现secure-http: OK和signature verification: OK - 注意:这种模式下,
repos.packagist是复数形式,和repo.packagist(完全替换)语义完全不同,不能混用










