大文件上传的ColdFusion设置


8

我正在尝试设置一个Coldfusion服务器来接受大文件的上传,并且遇到了一些限制。到目前为止,这是我观察到的内容:

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

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

“请求节流”是我真的不明白的事情。关于它的所有文档都将其称为存储区域的大小。如果是这样,那么我看不到它与文件大小的关系。它暗示了我只是不想相信的事情:ColdFusion将整个上传的文件先将其吸收到内存中,然后再将任何文件写入磁盘。当上载循环(读取中等大小的块,将其写入磁盘,重复直到完成)如此简单时,没有理智的人会这样做。(我知道HTTP multipart / form-data帖子的结构使它变得有点难,但是……肯定有像Adobe这样的具有Web开发产品的大公司可以做到这一点……是吗?)

如果实际上是在进行全文件限制,那么他们如何期望我们选择可行的大小限制?允许1 GB的存储空间,同时有几个用户甚至可以尝试在没有内存的情况下运行服务器。而什么是我们要做的事情,不是让技嘉上传?人们可以发布视频,而没有时间进行编辑!

附加信息

这是一些版本号。

网络服务器:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32

ColdFusion:

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)

附加信息#2

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

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

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

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

同样,有了这种新的理解,停滞的上传就变得有意义。服务器没有可用的内存来接受上传,因此它只是不从套接字读取。TCP缓冲区已满,窗口大小变为0,客户端等待它再次打开,这应该在服务器开始读取请求后立即发生。但就我而言,由于某种原因,这永远不会发生。服务器完全忘记了请求,因此流连忘返。

遇到“最大过帐数据大小”的情况仍然是个谜。达到硬限制的请求不应排队,而应拒绝。而且我确实在中收到拒绝消息(“帖子大小超出最大限制200 MB。”)server.log。但是在这种情况下,服务器似乎仍然忘记了该请求,而从未向客户端发送错误。


两个问题:1.您确定它是Cold Fusion,而不是Web服务器本身吗?和2.您是否查看了请求超时?
Katherine Villyard 2014年

1
我确定。没有超时(上传会填充一个TCP窗口,然后停顿。经过Wireshark的验证。从文件末尾切掉几个字节,它会在13秒内发送。)而且我可以将上传内容发布到静态HTML页面中,然后发送很好(它不会在任何地方保存,因为没有任何处理表单数据的操作,但关键是它不会停滞。)

Answers:


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)

希望这可以帮助。


这与我通过google找到的所有其他描述相似。他们都忽略了一两件事,我需要知道:该请求油门内存应该是更大的比后数据的最大尺寸。而且我也只是猜测Request Throttle Memory必须小于JVM Heap Size,从而不可能并行上传真正的大文件(接近或大于服务器的RAM)。不过,到目前为止,这是最好的答案,因此我赞成它,如果在赏金悬赏之前没有其他任何事情,我将接受它

1

您可以使用cftry-catch捕获错误并向用户显示自定义消息。话虽这么说,POST请求参数的最大数量,POST数据的最大大小,Request Throttle Threshold和Request Throttle Memory设置的值是什么。您使用的是CF Std还是Ent,ColdFusion的版本是什么?


cftry无法捕获错误。连接挂起而没有执行cfm的第一行。(我在此处放置了一个cflog,以了解是否已经到了,还没有到达。)我将向该问题添加一些版本信息。

Web服务器通常会抛出“文件太大”错误消息,而不是ColdFusion。如果您在CF日志中找不到任何内容,请检查事件查看器日志。肯定会有对该错误的引用。您是否尝试过Apache的 “ LimitRequestBody” 。您也可以在网络服务器端指定文件大小。
Anit Kumar 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.