You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VPS环境下ExpressJs管道传文件至BunnyCDN的PUT请求失效问题

问题:Express + BunnyCDN 部署到VPS后文件上传失败(本地正常)

我被这个问题困扰了几天,不知如何推进。我有一个ExpressJs服务器,其端点接收由multer处理的图片,随后通过管道传输至BunnyCDN存储的HTTP PUT请求。这套配置在开发环境中正常运行,但部署到VPS后,虽能看到success: chunk日志,却始终没有文件上传成功。我的VPS使用Nginx反向代理指向Node.js应用。

此前的一个线索是曾出现错误:Hostname/IP does not match certificate alt names。我通过移除options对象中的host属性,改为直接在请求中传入URL解决了该问题,且此问题仅在VPS环境中出现,本地开发无此情况。

相关代码如下:

let readStream = new Duplex();
tmp.push(value[0].buffer);
tmp.push(null);

const options = {
  method: "PUT",
  path: `/${process.env.STORAGE_ZONE_NAME}/${value[0].originalname}`,
  headers: {
    AccessKey: process.env.ACCESS_KEY,
    "Content-Type": "application/octet-stream",
  },
  agentOptions: { checkServerIdentity: function () {} },
};

const req = https.request('https://storage.bunnycdn.com', options, (res) => {
  res.on("data", (chunk) => {
    console.log("success:", chunk);
  });
});

req.on("error", (error) => {
  console.error(error);
});

readStream.pipe(req);

解决建议

1. 修复流变量名错误

代码中存在明显的变量名错误:声明了readStream,但后续用tmp.push操作,导致流没有正确写入数据。修正为:

let readStream = new Duplex();
readStream.push(value[0].buffer);
readStream.push(null);

2. 显式结束HTTP请求

管道传输后,需要显式结束请求,确保BunnyCDN收到完整数据:

readStream.pipe(req);
readStream.on('finish', () => {
  req.end();
});

3. 调整Nginx配置限制

Nginx反向代理可能限制了请求体大小或超时,在server块中添加/修改以下配置:

# 允许更大的上传文件体积,根据实际需求调整
client_max_body_size 100M;
# 延长超时时间,避免上传中途断开
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

4. 验证环境变量与权限

  • 打印process.env.STORAGE_ZONE_NAME和process.env.ACCESS_KEY,确认VPS环境中变量已正确加载
  • 检查BunnyCDN控制台,确认AccessKey拥有目标存储区的写入权限
  • 确认路径格式正确:/${存储区名称}/${文件名},避免多余斜杠或拼写错误

5. 修复SSL证书校验问题

跳过证书检查是临时方案,建议:

  • 检查VPS的DNS解析,确保storage.bunnycdn.com解析到正确IP
  • 升级Node.js到较新稳定版,避免旧版本的SSL兼容性问题

内容的提问来源于stack exchange,提问作者nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:00:32