大文件上传的 ColdFusion 设置

8 coldfusion upload

我正在尝试建立一个 Coldfusion 服务器来接受大文件的上传,但我遇到了一些限制。这是我迄今为止观察到的:

ColdFusion Administrator 中有两个限制上传大小的设置:“发布数据的最大大小”和“请求限制内存”。如果您的上传大小(包括 HTTP 开销)大于这些设置之一,则上传将被拒绝。我不明白为什么我们需要其中的两个;据我所知,无论哪个设置得更高都没有任何影响。较低者获胜。

当有人尝试上传太大的文件时,他们不会收到很好的错误消息。在发送大约 1 个 TCP 窗口的数据后,上传会永远挂起。它以一种非常糟糕的方式挂起。即使在客户端放弃并断开连接后,关联的 apache 线程仍然被占用(我可以使用 mod_status 看到这一点)。卡住的线程会不断增加,直到没有剩余的线程可以接受新请求并且必须重新启动服务器。

“请求限制”是我真的不明白的事情。所有关于它的文档都将其称为内存区域的大小。如果是这样,那么我看不出它与文件大小的关系。它暗示了一些我只是不想相信的事情:ColdFusion 在将任何文件写入磁盘之前将整个上传的文件放入内存中。当上传循环(读取中等大小的块,将其写入磁盘,重复直到完成)如此简单时,没有理智的人会这样做。(我知道 HTTP multipart/form-data post 的结构使它有点困难,但是......肯定像 Adob​​e 这样拥有 Web 开发产品的大公司可以做到这一点......他们不是吗?)

如果整个文件 slurping 真的发生了,他们如何期望我们选择一个可行的大小限制?允许一个千兆字节,几个同时使用的用户甚至无需尝试就可以使您的服务器内存不足。而什么是我们要做的事情,不是让技嘉上传?人们有视频要发布而没有时间编辑它们!

附加信息

这是一些版本号。

网络服务器:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32
Run Code Online (Sandbox Code Playgroud)

冷聚变:

Server Product           ColdFusion
Version                  ColdFusion 10,285437
Tomcat Version           7.0.23.0
Edition                  Enterprise
Operating System         Windows Server 2008 R2
OS Version               6.1
Update Level             /E:/ColdFusion10/cfusion/lib/updates/chf10000011.jar
Adobe Driver Version     4.1 (Build 0001)
Run Code Online (Sandbox Code Playgroud)

附加信息#2

我不知道你为什么想知道我在限制字段中放入了哪些值,但它们都设置为 200 MB 有一段时间了。我将“发布数据的最大大小”增加到 2000 MB,但没有效果。我已经发现,如果我将“请求节流内存”增加到 2000 MB,它将允许更大的上传。我在这里寻找的不是一个快速的“在那里填充更大的数字!” 答案,但详细解释了这些设置的实际含义以及它们对服务器内存使用的影响。

为什么服务器线程永远停止而不是在超出限制时返回错误消息可能是另一个问题。我认为这将是一个众所周知的问题。也许我应该先问问其他人是否可以复制它。我从未见过从 ColdFusion 返回给客户端的“文件太大”错误消息。它应该有一个吗?

附加信息 #3 一些实验让我得到了部分答案。我遗漏的第一件事是,如果“请求节流内存”(RTM) 设置高于“发布数据的最大大小”(MSOPD),它会做一些有用的事情。在我的第一轮测试中,对它们之间的关系一无所知,我把它们反过来了。根据我的新理解,我可以看到比率 RTM/MSOPD 是允许同时上传的数量,如果它们都接近最大大小。

假设“请求节流内存”实际上是一个内存缓冲区,而不是一个临时文件,这意味着我最担心的事情是正确的。每个文件在上传的整个过程中都完全保存在内存中。没有人说过任何让我相信的事情(尽管我也没有看到有人跳起来说“是的,他们做了这件愚蠢的事情”)

同样有了这种新的理解,停滞的上传就有意义了。服务器没有可用的内存来接受上传,所以它只是不从套接字读取。TCP 缓冲区填满,窗口大小变为 0,客户端等待它再次打开,服务器开始读取请求时应该会发生这种情况。但就我而言,出于某种原因,这从未发生过。服务器完全忘记了请求,所以它只是徘徊。

“最大帖子数据大小”被击中的情况仍然有点神秘。达到硬限制的请求不应排队,只需拒绝即可。而且我确实在server.log. 但同样在这种情况下,服务器似乎忘记了请求,而从未向客户端发送错误。

小智 1

我还将尝试解释调整设置:-

  • POST 请求参数的最大数量- 这是指通过特定请求发送的属性/参数的最大数量。特别是在表单上发布数据时使用。
  • 发布数据的最大大小- 这是可以在服务器上发布的最大数据。这是 POST 请求期间特定表单中所有数据的总和。
  • 请求限制阈值- 如果需要,ColdFusion 可以限制(强制减慢)传入请求。但是,无论节流状态如何,都可以允许非常小的请求(有效负载较小的请求)通过。要允许处理小请求,请指定允许的最大大小(默认值为最大 4 MB)。
  • 请求限制内存- 要限制请求,请指定为限制分配的最大内存量。如果没有足够的可用总内存,ColdFusion 会将请求排队,直到有足够的可用内存(默认为 200 MB)。它不会为 Req1 保留内存,因为它低于阈值。

假设存在三个同时请求 Req1 (3 MB)、Req2 (6 MB) 和 Req3 (9 MB)。在默认设置下,请求限制阈值设置为 4MB,ColdFusion 将在限制内存中保留 (6+9=15MB)。同样,它会继续为所有并发请求添加请求限制内存,限制是我们为请求限制内存设置的值(默认为 200 MB)

希望这可以帮助。