【问题标题】:Connection Reset during large file uploads to AWS s3 using Multer-s3使用 Multer-s3 将大文件上传到 AWS s3 期间的连接重置
【发布时间】:2020-12-27 08:44:07
【问题描述】:

我目前有一个有效的上传系统,包括一个进度条,它使用 Axios 从我的前端将文件上传到我的 AWS s3 存储桶(通过 EC2 实例上的节点 JS 后端上的 multer-s3)。

系统适用于较小的文件,但在上传较大的文件时失败。

我的用户需要上传的文件大小在 20MB 到 1Gb 之间

我知道有很多类似的问题,但据我所知,他们要么没有答案,要么答案未被 OP 接受。此外,许多答案都以“使用分段上传”的形式出现,但在我(有限的)理解中,我的印象是 Multer/Multer-s3 中间件是为了解决这个问题,因为我有一个(几乎)工作系统我更愿意使用 multer 来解决这个问题(假设有 multer 的解决方案)

我在控制台中遇到的错误是:

POST [server ip/url] net::ERR_CONNECTION_RESET

一开始我以为是大于275MB的文件,但是当我计时的时候,每次大约60秒就停止进度,所以可能是超时问题。 注意:进度条在 60 秒处停止,但直到上传停止后大约 30 或 40 秒后,错误才会显示在控制台中

上传代码如下:

       var uploadResources = multer({
        storage: multerS3({
        s3: s3,
        bucket: bucketName,
        acl: "public-read",
        contentType: multerS3.AUTO_CONTENT_TYPE,
        metadata: function (req, file, cb) {
          cb(null, {fieldName: file.fieldname});
        },
        fileFilter, limits: { 
          fileSize: MAX_SIZE
        },
        key: function (req, file, cb) {
          cb(null,  ClientObjects + "/" +
                    req.headers.path + "/" +
                    req.headers.pid + "/" +
                    req.headers.tofrom + "/" +
                    file.originalname)
        }
      })
    });

app.post(
  '/uploadResources/', uploadResources.array('file', 1), (req, res) => {
    res.json({
      file: req.file,
    });
});

我所尝试的(来自网络上的各种帖子 - 我的搜索历史涉及任何关键字都是完全紫色的!):

增加或删除我的文件过滤器:

const MAX_SIZE = 9000000000

fileFilter, limits: { 
          fileSize: MAX_SIZE
        },

覆盖多重限制:

var limits = {
  files: 1, // allow only 1 file per request
  fileSize: 900 * 1024 * 1024 
  };


var uploadResources = multer({
  limits: limits,
  storage: multerS3({
    s3: s3,
    bucket: bucketName,
    acl: "public-read",
    contentType: multerS3.AUTO_CONTENT_TYPE,
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
  . . . . etc etc etc (as above)

增加“过期”时间:

    ......
        storage: multerS3({
            s3: s3,
            bucket: bucketName,
            acl: "public-read",
            Expires: 3600,
            contentType: multerS3.AUTO_CONTENT_TYPE,
.... etc etc .....

更改 AWS 超时时间 (为此我尝试了更大的数字以及 0 以使其无限)

aws = require('aws-sdk')

aws.config.httpOptions.timeout = 0;

aws.config.httpOptions.timeout = 3600;

编辑:我也尝试过 res.setTimeout in route

所以在这个阶段,我仍然不确定问题出在哪里。我猜它可能是以下任何一种或任何一种的混合:

  1. EC2
  2. s3
  3. 穆尔特
  4. Multer-s3
  5. Axios

帮助我 Obi-stack-overflow-nobie,你是我唯一的希望!

更新 我尝试了一个测试:我在本地运行我的节点服务器并限制了我的速度。我有一个文件需要大约 7 分钟才能上传到 s3(从我的 localhost 前端到 localhost 后端,然后到我的 s3 存储桶),它就像一个魅力。所以这告诉我这与我的 ec2 有关。

我的设置是在大文件上传期间在 60 秒时重置 POST 连接

更新 2 : 我一直在查看我的 ec2 sysctl 设置,发现 net.ipv4.tcp_fin_timeout 设置为 60(我的连接重置的确切时间)。我将其提高到 320 并将其设置为新的默认值并重新启动了我的 ec2 实例 - 我仔细检查了更改仍然存在......但我仍然遇到同样的问题 - 小快速上传好,长时间大上传不好:( 我不可能是互联网上唯一拥有 ec2 并想使用 multer 将大文件上传到 s3 的人

更新 3: 我绕过了我的 ec2 并设置了一个运行全新安装的 Ubuntu 的 AWS lightail 服务器。我安装了与我的 ec2 相同版本的节点,我将我的 git 存储库拉过来,运行服务器并尝试了相同的测试......并在 60 秒时得到完全相同的错误......还确认小文件仍然可以正常工作....所以这告诉我它不是 ec2 独有的......但它仍然可能是 AWS 范围内的限制......这正在慢慢杀死我。

更新 4: 刚刚有个朋友有一个运行 Ubuntu 的谷歌云虚拟机,从 github 加载我的应用程序,我们尝试通过它上传......它运行良好......

所以我的测试结果如下:

AWS EC2: 60 秒,连接重置

使用 ubuntu 的 AWS Lightsail: 60 秒,连接重置

Windows 本地主机:成功上传超过 7 分钟

使用 ubuntu 的 Google VM:成功上传超过 3 分钟

在我看来,基于这些结果,我只能得出结论,AWS 对 VM 有某种硬限制,不允许 TCP 连接超过 60 秒。

有人愿意提供另一个结论吗?我全神贯注。

【问题讨论】:

    标签: linux amazon-web-services amazon-s3 amazon-ec2


    【解决方案1】:

    直接使用 OP 进行调试,这可以追溯到在 repo 中提交的 node_modules 并导致 dev OS 和 EC2 OS 之间的连接处理问题。

    解决方案:

    • 从 repo 中取消跟踪 Node_modules
    • 更新 EC2,删除 node_modules
    • 运行 npm install 以获取正确的操作系统依赖项

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但是,它不是由错误的 node_modules 引起的。在我的例子中,我将我的项目构建到一个 docker 映像,然后部署到 Amazon ECS。

      使用node:lts-alpine 是我触发此问题的原因。非高山版本node:lts 也有这个问题。节点 docker 镜像仍然使用 12.x 进行 LTS,最新的节点 LTS 版本现在是 14.x。

      我的解决方案是切换到node:14-alpine。这解决了问题,我不再遇到 60 秒连接问题。

      作为参考,截至本文发布时,Node 12.19.0 是节点 docker 映像标记为 lts 的版本。

      【讨论】:

        猜你喜欢
        • 2019-10-31
        • 2019-10-26
        • 2021-10-04
        • 2021-04-04
        • 2011-12-07
        • 2017-05-22
        • 2020-10-23
        • 2020-04-29
        • 1970-01-01
        相关资源
        最近更新 更多