Composer 1.0+ 默认启用 secure-http,主动拒绝 HTTP 仓库 URL,不发起请求即报错或静默失败;必须配置 HTTPS 或对特定仓库临时禁用 secure-http 并确保认证与网络隔离。

直接用 HTTP 连接 Nexus 的 Composer 仓库是不安全的,composer install 会因默认启用 secure-http 而报错或静默失败。必须显式配置信任或改用 HTTPS。
为什么 composer install 会拒绝 HTTP 仓库
Composer 1.0+ 默认开启 secure-http,禁止所有非 HTTPS 的仓库 URL。错误典型表现是:
The 'http://localhost:8081/repository/composer-proxy/' URL could not be accessed: HTTP/1.1 400 Bad Request(实际可能是 302 重定向到 HTTPS 失败,或直接被拦截)
这不是 Nexus 配置问题,而是 Composer 主动拒绝——它甚至不会发请求过去。
- 即使 Nexus 后端没开 HTTPS,也得让 Composer “同意”走 HTTP
- 仅关闭
secure-http不够,还需确保仓库 URL 和证书(如启用 HTTPS)匹配 - 全局关闭
secure-http是危险操作,应只对特定仓库临时禁用
安全连接的两种可行路径
真正安全 ≠ 必须 HTTPS,而是“可控 + 可验证”。内网环境下,HTTPS 带来额外运维成本(证书签发、续期、Nginx/TLS 终结),而 HTTP + 认证 + 网络隔离同样满足安全基线。
-
推荐:HTTP + Basic Auth(适合内网):在 Nexus 中为 Composer 仓库启用
Anonymous Access或创建专用用户,在composer.json的repositories里写带凭据的 URL:"url": "https://user:pass@localhost:8081/repository/composer-hosted/"。注意:URL 必须是 HTTPS 才能塞凭据;若用 HTTP,凭据会被忽略 -
生产环境强推:HTTPS + 有效证书:用 Let's Encrypt 或企业 CA 签发证书,Nexus 前置 Nginx 或直接配置 Jetty TLS。此时
secure-http自然通过,无需额外开关 - 不推荐:全局
composer config -g secure-http false—— 会削弱所有后续仓库的安全校验,包括你未来可能加的 Packagist 镜像
如何正确配置 composer.json 连 Nexus
关键不是 URL 写法,而是仓库类型和认证方式是否匹配 Nexus 实际设置。Hosted、Proxy、Group 三类仓库行为不同:
- Proxy 类型仓库(如代理 Packagist):必须确保 Nexus 已成功抓取过包元数据,否则
composer install会卡在Reading composer.json of vendor/package (dev-main)并超时 - Hosted 类型:上传私有包后,需手动点击 Nexus UI 的
Rebuild index,否则 Composer 查不到新包 - Group 类型:URL 指向 Group,但内部 Proxy 仓库若配置了
Remote storage为http://packagist.org,仍会触发secure-http拒绝——必须把 remote URL 改成 HTTPS 版本 - 示例安全配置(内网 Hosted):
{ "repositories": [ { "type": "composer", "url": "https://nexus.internal.example.com/repository/php-private/" } ], "config": { "secure-http": true, "http-basic": { "nexus.internal.example.com": { "username": "php-deploy", "password": "xxx" } } } }
最容易被忽略的点:Nexus 插件版本与 Composer 客户端兼容性
Nexus Repository Composer 插件(nexus-repository-composer)并非官方 Sonatype 组件,不同版本对 Composer 协议支持程度差异大:
- v2.x 插件要求 Composer 2.2+,若你用的是
composer v1.x(如某些旧 CI 镜像),会返回406 Not Acceptable—— 因为插件只响应application/vnd.composer.v2+json - 插件未启用或未启动时,Nexus 返回 404,但 Composer 报错信息模糊,容易误判为网络问题
- 检查命令必须用
bundle:list | grep composer(Karaf 控制台),而非只看 UI 是否出现 Recipe 选项











