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
相关产品推荐
相关产品推荐

