web-dev-qa-db-ja.com

大きなファイルをアップロードするためのColdFusionの設定

大きなファイルのアップロードを受け入れるようにcoldfusionサーバーを設定しようとしていますが、いくつかの制限にぶつかっています。これが私がこれまでに観察したものです:

アップロードのサイズを制限するColdFusion Administratorの設定には、「投稿データの最大サイズ」と「リクエストスロットルメモリ」の2つがあります。アップロードのサイズ(HTTPオーバーヘッドを含む)がこれらの設定のいずれかよりも大きい場合、アップロードは拒否されます。これらのうち2つが必要な理由がわかりません。どちらを高く設定しても、私が知る限り効果はありません。下の方が勝つ。

大きすぎるファイルをアップロードしようとしても、Niceエラーメッセージは表示されません。約1 TCP=ウィンドウ相当のデータを送信した後、アップロードが永遠にハングアップします。そして、それは本当に悪い方法でハングアップします。クライアントが諦めて切断した後でも、関連するApacheスレッドはまだ拘束されています(私はmod_statusを使用してこれを確認できます。)スタックスレッドは、新しい要求を受け取るためのものがなくなり、サーバーを再起動する必要があるまで、ビルドを続けます。

「リクエストスロットル」は、私には本当にわかりません。それに関するすべてのドキュメントは、メモリ領域のサイズとしてそれについて語っています。それがそうであるなら、私はそれがファイルサイズにどのように関連しているかを見ることができません。それは、私が信じたくないことをほのめかします。ColdFusionは、アップロードされたファイル全体をディスクに書き込む前にメモリに丸呑みします。アップロードループ(中サイズのブロックを読み取り、ディスクに書き込み、完了するまで繰り返す)が非常に簡単な場合、正気な人はそれを行いません。 (HTTP multipart/form-data postの構造が少し難しくなることを知っていますが...確かに、Adobeのような大企業がWeb開発製品を持っているなら、これを正しく行うことができます...できませんか?)

ファイル全体の丸呑みが実際に起こっている場合、実行可能なサイズ制限を選択することをどのように期待しますか?ギガバイトを許可すると、数人の同時ユーザーがサーバーをメモリ不足で実行することなく実行できます。そして、私たちは何をするつもりですかギガバイトのアップロードを許可しません?投稿する動画があり、編集する時間はありません。

追加情報

ここにいくつかのバージョン番号があります。

ウェブサーバー:

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に設定されていました。 「投稿データの最大サイズ」を2000MBに増やしても効果がありませんでした。 「Request Throttle Memory」を2000 MBに増やすと、より大きなアップロードが可能になることはすでにわかっています。私がここで探しているのは、すぐに「そこに大きな数字を入れる」ことではありません。回答ですが、これらの設定が実際に何を意味するか、およびサーバーのメモリ使用量にどのような影響があるかについての詳細な説明です。

制限を超えたときにエラーメッセージを返さずにサーバースレッドが永久に停止する理由は、別の質問である可能性があります。これはよく知られた問題だと思いました。たぶん、他の誰かがそれを再現できるかどうか最初に尋ねるべきでしょう。 ColdFusionからクライアントに返される「ファイルが大きすぎます」というエラーメッセージは見たことがありません。 仮定されていますか

追加情報#いくつかの実験により、部分的な答えが得られました。最初に欠けていたのは、「リクエストスロットルメモリ」(RTM)が「ポストデータの最大サイズ」よりも高いに設定されている場合に役立つことです。 (MSOPD)。最初のテストでは、それらの関係についての手がかりがなく、逆にしてもらいました。私の新しい理解により、RTM/MSOPDの比率は、すべてが最大サイズに近い場合に許可される同時アップロードの数であることがわかります。

「リクエストスロットルメモリ」が実際には一時ファイルではなくメモリバッファであると仮定すると、これは私の最悪の恐れが正しかったことを意味します。アップロード中は、すべてのファイルが完全にメモリに保持されます。誰も私にそう思わないようにさせるようなことは何もしていません(「はい、彼らがこの愚かなことをした」と言うためにジャンプする人は誰も見ませんが)

また、この新しい理解により、停止されたアップロードは理にかなっています。サーバーには、アップロードを受け入れるためのメモリがありません。そのため、ソケットからの読み取りは行われません。 TCPバッファがいっぱいになり、ウィンドウサイズが0になり、クライアントが再び開くのを待機します。これは、サーバーが要求の読み取りを開始するとすぐに発生します。ただし、私の場合、サーバーはリクエストを完全に忘れているため、そのまま残ります。

「ポストデータの最大サイズ」がヒットするケースはまだ謎です。ハード制限に達したリクエストはキューに入れられず、拒否されます。また、server.logに拒否メッセージ(「投稿サイズが上限の200 MBを超えています」)が表示されます。ただし、この場合も、サーバーはクライアントにエラーを送信せずに要求を忘れているようです。

8
user193597

また、チューニングの設定についても説明します。

  • 最大数POSTリクエストパラメータ-これは、特定のリクエストで送信される属性/パラメータの最大数を指します。特に、フォームにデータを投稿するときに使用されます。
  • 投稿データの最大サイズ-これはサーバーに投稿できる最大データです。これは、POST要求中の特定の形式のすべてのデータの合計です。
  • リクエストスロットルしきい値-必要に応じて、ColdFusionは受信リクエストをスロットル(強制的にスローダウン)できます。ただし、スロットルの状態に関係なく、本当に小さなリクエスト(ペイロードが小さいリクエスト)は通過できます。小さな要求を処理できるようにするには、許可される最大サイズを指定します(デフォルトは最大4 MB)。
  • リクエストスロットルメモリ-リクエストをスロットルするには、スロットルに割り当てるメモリの最大量を指定します。十分な総メモリが利用できない場合、ColdFusionは十分なメモリが解放されるまでリクエストをキューに入れます(デフォルトは200 MB)。しきい値より低いため、Req1のメモリを予約しません。

Req1(3 MB)、Req2(6 MB)、およびReq3(9 MB)の3つの同時要求があることを考慮してください。デフォルト設定では、リクエストスロットルしきい値は4MBに設定されており、ColdFusionはスロットルメモリに予約します(6 + 9 = 15MB)。同様に、すべての同時リクエストにリクエストスロットルメモリを追加し続け、制限はリクエストスロットルメモリに設定したものです(デフォルトは200 MB)。

お役に立てれば。

1
Anit Kumar

Cftry-catchを使用してエラーをキャプチャし、カスタムメッセージをユーザーに表示できます。とはいえ、POSTリクエストパラメータの最大数、ポストデータの最大サイズ、リクエストスロットルしきい値、リクエストスロットルメモリ。 CF StdまたはEntを使用していますか、ColdFusionのバージョンは何ですか?

1
Anit Kumar