确认是穿透链路问题而非composer本身出错:运行composer install -vvv若错误总出现在第二个包下载前,且curl -i https://mirrors.aliyun.com/composer/packages.json能通但composer不行,即表明frp/ngrok等穿透工具空闲时主动断连,而composer未启用keep-alive导致复用已断socket。

内网穿透下Composer报“Connection reset by peer”怎么确认是穿透链路问题
不是 Composer 本身出错,而是 frp/ngrok 等穿透工具在空闲时主动关闭 TCP 连接,而 Composer 默认不启用 HTTP 长连接(keep-alive),导致后续请求复用已断开的 socket,直接触发 Connection reset by peer。运行 composer install -vvv,如果错误总出现在第二个包下载前、且 curl -I https://mirrors.aliyun.com/composer/packages.json 能通但 Composer 不行,基本就是穿透层心跳缺失。
必须改的三个 Composer 配置项(非可选)
内网穿透环境对连接稳定性极度敏感,仅换镜像源或调 http.timeout 不够,需同时收紧底层 HTTP 行为:
-
composer config -g http.keepalive true:强制开启 keep-alive,避免每次请求都新建 TCP 连接 -
composer config -g http.connect-timeout 30:缩短建连超时,防止卡在穿透隧道握手阶段 -
composer config -g http.max-retries 5:穿透链路抖动常见,重试次数必须高于默认的 2 次
注意:http.keepalive 在 Composer 2.2+ 才生效;若用旧版,升级优先于调参。
穿透服务端必须加的配置(frp 示例)
客户端配再好,穿透服务端没心跳保活,照样断。以 frp 为例,frps.ini 必须含以下两项:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
heartbeat_timeout = 90:服务端等待心跳超时时间,设为 90 秒(不能低于 Composer 的connect-timeout) -
tcp_mux = true:启用 TCP 多路复用,减少穿透隧道数,降低 NAT 设备清理概率
若用 ngrok,对应参数是 --heartbeat-interval=30s 和 --multiplex=true;未启用这些,Composer 即使开了 keepalive 也无意义。
为什么 --prefer-dist 在穿透环境下更稳
因为 --prefer-dist 下载的是 ZIP 包,整个 HTTP 请求是一次性 GET + 响应体流式传输;而默认的 --prefer-source(git clone)会建立多个短连接(fetch refs、shallow clone、checkout),每一步都可能被穿透中间件掐断。
- 临时应急:加
--prefer-dist参数绕过问题 - 长期方案:在
composer.json中写"config": { "preferred-install": "dist" },避免每次手动输 - 验证是否生效:看日志里是否出现
Downloading https://mirrors.xxx.com/xxx.zip,而非Cloning git@...
穿透链路越不稳定,dist 包的优势越明显——它把多次交互压缩成一次完整响应,对中间设备更“友好”。










