我正在尝试设置一个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
。但是在这种情况下,服务器似乎仍然忘记了该请求,而从未向客户端发送错误。