我试图build立一个coldfusion服务器来接受大文件的上传,而我正在碰到一些限制。 这是我迄今观察到的:
ColdFusionpipe理员有两个限制上传大小的设置:“最大数据量”和“请求节stream存储器”。 如果上传的大小(包括HTTP开销)大于其中任何一个设置,上传将被拒绝。 我无法弄清楚为什么我们需要其中的2个; 据我所知,无论哪一个设置较高,都没有任何影响。 较低的一个胜利。
当有人试图上传一个太大的文件时,他们不会收到一个很好的错误信息。 发送大约1个TCP窗口的数据后,上传只是永远挂起。 它挂在一个非常糟糕的方式。 即使在客户端放弃并断开连接之后,相关的apache线程仍然是绑定的(我可以使用mod_status来看到这一点)。 卡住的线程只是保持build立,直到没有剩下的新请求和服务器必须重新启动。
“请求节stream”是我真的不明白的事情。 所有关于它的文档都将其称为内存区域的大小。 如果是这样的话,我看不出它与文件大小有什么关系。 它暗示了一些我不想相信的东西:在将任何文件写入磁盘之前,ColdFusion将整个上传的文件分散到内存中。 没有理智的人会这样做,当上传循环(读取中等大小的块,将其写入磁盘,重复直到完成)非常简单。 (我知道HTTP multipart / form-data这个post的结构有点难,但是……像Adobe这样的一家大公司可以做到这一点…不是吗?)
如果整个文件混淆实际上是怎么回事,他们如何期望我们select一个可行的大小限制? 允许一个千兆字节和几个同时用户可以运行你的服务器内存不用,甚至没有尝试。 我们要做什么,不允许千兆字节上传? 人们有video发布,没有时间编辑它们!
附加信息
这里是一些版本号。
networking服务器:
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
我不知道为什么你想知道我在限制字段中input了什么值,但是他们都被设置为200MB一段时间。 我增加了“最大邮政数据大小”到2000 MB,并没有效果。 我已经知道,如果我增加“请求节stream内存”到2000 MB,它将允许更大的上传。 我在这里找的不是一个快速的“东西,在那里一个更大的数字!” 回答,但详细解释这些设置实际上意味着什么和他们对服务器内存使用的影响。
为什么服务器线程永远停止,而不是在超出限制时返回错误消息可能是单独的问题。 我认为这将是一个众所周知的问题。 也许我应该先问一下其他人是否可以重现它。 我从来没有看到从ColdFusion返回给客户端的“文件太大”错误消息。 它应该有一个?
其他信息#3一些实验使我得到了部分答案。 我错过的第一件事是,如果设置的“请求节stream内存”(RTM)的设置高于 “最大数据大小”(MSOPD),那么它就会有用。 在我的第一轮testing中,对于它们之间的关系毫无头绪,我反其道而行之。 根据我的新理解,我可以看到,RTM / MSOPD比率是同时上传的数量,如果它们都接近最大大小,则将被允许。
假设“Request Throttle Memory”实际上是一个内存缓冲区,而不是一个临时文件,这意味着我最担心的是正确的。 每个文件在整个上传过程中完全保存在内存中。 没有人说过任何话让我相信(尽pipe我也没有看到有人跳起来说“是的,他们做了这个愚蠢的事情”)
也有了这个新的理解,停滞的上传是有道理的。 服务器没有可用的内存来接受上传,所以它只是不从套接字读取。 TCP缓冲区填满,窗口大小变为0,客户端等待它再次打开,这应该在服务器开始读取请求后立即发生。 但在我的情况下,由于某种原因,这从来没有发生。 服务器完全忘记了这个请求,所以它只是徘徊。
“最大数据量”被打的情况仍然是一个谜。 要求达到硬限制的请求不应该排队,只是被拒绝。 我在server.log收到拒绝信息(“邮政大小超过最大限制200 MB”)。 但是在这种情况下,服务器似乎忘记了请求,而没有向客户端发送错误。
我也会尝试解释调整的设置:
考虑有三个同时请求Req1(3 MB),Req2(6 MB)和Req3(9 MB)。 使用默认设置,请求节stream门限设置为4MB,ColdFusion将在节stream存储器中保留(6 + 9 = 15MB)。 同样,它将继续为所有同时请求添加请求油门内存,并且限制是我们为请求油门内存设置的(默认为200 MB)
希望这可以帮助。
您可以使用cftry-catch捕获错误并向用户显示自定义消息。 话虽如此, POST请求参数的最大数量,发布数据的最大大小,请求节stream阀值和请求节stream存储器设置的值是多less 。 您是否使用CF标准或Ent和什么是ColdFusion的版本?