curl error 7 根本原因是请求未发出,卡在 dns、tls、http 认证或 web 路径四层;需依次排查认证头缺失(用 http-basic 或 options.http.header)、自签名证书路径与权限、nginx/apache 路径映射是否精确指向 satis output-dir、git 连通性及 packages.json 内容是否为空。

Composer 报 Curl error 7、Could not fetch https://satis.internal/repo/packages.json 或静默跳过私有源,基本不是 Composer 配置写错了,而是请求根本没发出去——卡在 DNS、TLS、认证或路径这四层里。
curl 能通但 composer 不行,先查 HTTP 认证头是否缺失
Composer 不会自动继承你终端的 curl -u 或浏览器登录态。如果 Satis 托管在 Nginx/Apache 下启用了基础认证(Basic Auth),必须显式传 Authorization 头:
- 项目级配置:在
composer.json的repositories项里加"options": {"http": {"header": ["Authorization: Basic base64user:pass"]}} - 全局配置(团队统一):
composer config -g http-basic.satis.internal username password,它会自动生成 header - 别手算 base64——用
echo -n 'user:pass' | base64,注意-n,否则换行符会导致认证失败 - 若用 token(如 GitLab Personal Access Token),格式是
Authorization: Bearer xxx,此时必须用options.http.header手动写,http-basic不支持
HTTPS 自签名证书报 SSL certificate problem,别关 TLS
错误信息里带 SSL certificate problem,说明 PHP cURL 拒绝了证书链。绕过验证(COMPOSER_DISABLE_TLS=1)只适合本地调试,生产环境必须正向解决:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认证书 PEM 文件路径可被 PHP 进程读取(比如 CI 节点上
/etc/ssl/certs/internal-ca.pem权限是 644,且运行用户能访问该路径) - 在
composer.json中为该仓库指定:"options": {"ssl": {"cafile": "/etc/ssl/certs/internal-ca.pem"}} - 或全局生效:
composer config -g cafile /etc/ssl/certs/internal-ca.pem,但要注意该命令需以和composer install相同的用户执行 - PEM 文件里不能有注释、空行、多余空格;用
openssl x509 -in cert.pem -text -noout验证是否可解析
packages.json 返回 404,重点检查 Web 服务器路径映射
Satis 生成的是静态文件,不提供动态路由。浏览器打开 https://satis.internal/repo/packages.json 404,大概率是 Nginx/Apache 没把 URL 路径对齐到 Satis 输出目录:
-
satis.json中的output-dir必须是绝对路径(如/var/www/satis),且 Web 用户(如www-data)有读取权限 - Nginx 配置里
root或alias必须精确指向该目录,例如:location /repo { alias /var/www/satis; }—— 注意末尾斜杠和alias行为差异 - 确保
index.html和packages.json在输出目录根层,而不是嵌套在web/或dist/子目录下 - 别依赖重定向:Satis 不生成
/repo/→/repo/index.html的逻辑,Web 服务器得自己配好index指令
git clone 卡住或超时,这不是 Composer 的 timeout 设置能改的
如果错误日志里出现 Cloning into 'xxx' 然后长时间无响应,问题不在 Composer,而在系统 Git 层:
- 运行
git ls-remote https://gitlab.internal/myorg/pkg.git测试连通性,失败就别跑satis build - HTTPS 协议下设 Git 超时:
git config --global http.postBuffer 524288000、git config --global http.lowSpeedLimit 0、git config --global http.timeout 300 - SSH 协议下检查
~/.ssh/config是否有ConnectTimeout 10和ServerAliveInterval 30 - CI 环境优先用 HTTPS + token,避免 SSH 密钥分发和代理问题;本地开发保留 SSH 可以,但要确保
ssh -T git@gitlab.internal能通
最常被忽略的一点:Satis 构建成功 ≠ 包可用。即使 packages.json 返回了 200,也得打开它看 packages 字段是否为空数组——那说明 satis.json 里的 repositories 地址压根没被识别为有效 VCS 源,或者 Git 服务返回了空的 tag 列表。










