我正在尝试设置一个coldfusion服务器来接受大文件的上传,但我遇到了一些限制。这是我到目前为止观察到的:
ColdFusion Administrator 中有两个限制上传大小的设置:“发布数据的最大大小”和“请求节流内存”。如果您上传的大小(包括 HTTP 开销)大于其中任一设置,则上传会被拒绝。我不明白为什么我们需要其中两个;据我所知,无论哪个设置得更高都没有任何影响。较低的获胜。
当有人尝试上传太大的文件时,他们不会收到很好的错误消息。在发送了大约 1 个 TCP 窗口的数据后,上传就永远挂起。它以一种非常糟糕的方式挂起。即使在客户端放弃并断开连接后,关联的 apache 线程仍然被占用(我可以使用 mod_status 看到这一点)。卡住的线程只会不断增加,直到没有剩余的线程可以接受新请求并且必须重新启动服务器。
“请求节流”是我真的不明白的东西。所有关于它的文档都将它称为内存区域的大小。如果是这样,那么我看不出它与文件大小有什么关系。它暗示了一些我不想相信的事情:ColdFusion 在将整个上传的文件写入磁盘之前将其吞入内存。没有理智的人会这样做,当上传循环(读取一个中等大小的块,将其写入磁盘,重复直到完成)如此简单时。(我知道 HTTP 多部分/表单数据帖子的结构使它有点困难,但是......肯定像 Adobe 这样拥有网络开发产品的大公司可以做到这一点......他们不能吗?)
如果整个文件的 slurping 确实发生了,他们如何期望我们选择一个可行的大小限制?允许一个千兆字节和几个同时使用的用户甚至无需尝试即可运行您的服务器内存不足。我们要做什么,不允许千兆字节上传?人们有视频要发布,没有时间编辑它们!
附加信息
以下是一些版本号。
网络服务器:
Server: Apache/2.2.24 (Win64) mod_jk/1.2.32
冷融合:
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,客户端等待它再次打开,这应该在服务器开始读取请求时立即发生。但就我而言,出于某种原因,这永远不会发生。服务器完全忘记了请求,所以它只是徘徊。
“发布数据的最大大小”被击中的情况仍然有点神秘。达到硬限制的请求不应排队,而应被拒绝。而且我确实在server.log
. 但同样在这种情况下,服务器似乎忘记了请求,而没有向客户端发送错误。
您可以使用 cftry-catch 捕获错误并向用户显示自定义消息。话虽如此,最大 POST 请求参数数量、最大发布数据大小、请求节流阈值和请求节流内存的值是多少。您使用的是 CF Std 还是 Ent,ColdFusion 的版本是什么?
我还将尝试解释调整的设置:-
考虑有三个同时请求 Req1 (3 MB)、Req2 (6 MB) 和 Req3 (9 MB)。在默认设置下,Request Throttle Threshold 设置为 4MB,ColdFusion 将在 Throttle Memory 中保留 (6+9=15MB)。同样,它将继续为所有同时请求添加请求节流内存,并且限制是我们为请求节流内存设置的限制(默认为 200 MB)
希望这可以帮助。