多项目不能共用全局代理配置,因composer的http-proxy和https-proxy配置按用户写入~/.composer/config.json,而web服务(如php-fpm)或ci工具常以www-data等不同用户身份运行,无法读取当前shell用户的配置;需改用系统级配置/etc/composer/config.json或为各用户单独配置。

多项目下为什么不能共用全局代理配置
因为 Composer 的 http-proxy 和 https-proxy 配置是按用户写入 ~/.composer/config.json 的,而 Web 服务(如 php-fpm)或 CI 工具(如 GitHub Actions runner)往往以 www、www-data 或临时用户身份运行,根本读不到你当前 shell 用户的配置。你在终端里 composer install 能走代理,不代表网页请求或 cron 任务也能走。
常见表现:Loading composer repositories 卡死、无报错、超时;curl -x http://127.0.0.1:8080 https://packagist.org/packages.json 能通,但 composer install 不行——说明不是代理本身问题,而是配置没落到真实运行用户上。
- 别用
sudo composer config -g:这会写进root的配置,www用户仍不可见 - 验证方式:切换到目标用户执行
sudo -u www composer config -g --list | grep -E "(http|https)-proxy",两行都得有且格式正确 - Linux/macOS 下若
~/.composer权限为root:root,普通用户首次写配置会失败,需先chown -R $USER:$USER ~/.composer
真正生效的代理配置路径只有两个
Composer 2.2+ 支持系统级配置文件 /etc/composer/config.json,它不依赖 HOME 目录,所有用户(包括 www-data)都会加载。但必须同时满足四个硬性条件:
-
/etc/composer/目录存在,权限为755,属主root:root - 配置文件路径必须是
/etc/composer/config.json(不能是/etc/composer.json) -
http-proxy和https-proxy必须作为顶层键写入,值必须是http://开头(哪怕代理监听 HTTPS 端口) - 用户名/密码含
@、/、:时,必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword
正确示例:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"config": {
"http-proxy": "http://user:pa%40ss%2Fword@127.0.0.1:8080",
"https-proxy": "http://user:pa%40ss%2Fword@127.0.0.1:8080"
}
}
代理配好还卡在 TLS 握手?检查证书信任链
公司内网代理常做 SSL 中间人(MITM),导致 Composer 认不出证书。现象是 cURL error 28、SSL certificate problem 或静默超时,和网络延迟无关。
- 必须显式指定根证书路径:
sudo composer config -g cafile /path/to/company-root-ca.pem - 不要用系统默认的
ca-bundle.crt,它不含企业私有 CA - Windows + WSL2 用户常因主机与子系统时间不同步导致握手失败,运行
sudo hwclock -s同步时间 - 临时验证是否真走代理:加
-n -vvv运行composer install,日志中出现Proxy CONNECT才算成功
NTLM 代理环境下必须用中转工具
Composer 原生不支持 NTLM 认证,直接设 http-proxy 会返回 407 Proxy Authentication Required 或连接拒绝。
解决方案只能是引入本地中转代理:
- Windows 域环境推荐
cntlm或px,让它们监听127.0.0.1:3128并处理 NTLM - 再让 Composer 连这个本地地址:
composer config -g http-proxy http://127.0.0.1:3128和https-proxy http://127.0.0.1:3128 - 验证中转层:运行
curl -x http://127.0.0.1:3128 -I https://packagist.org/packages.json,若也报 407,说明中转没配好
镜像源和代理互斥,多项目共存时最稳的方案永远是:清掉所有 repo.packagist 配置,只留干净的 http-proxy/https-proxy,并确保 cafile 指向正确的根证书——其他任何混合写法,90% 会在某个项目里突然失效。










