私の会社のファイルアップロードサービスを開発しています。私たちのユーザーは、非常に大きなイラストレーターファイルでいっぱいの非常に大きな.zipファイルを送信することがよくあります。一般的に、ファイルは1.5GBを超えませんが、最大4GBのファイルを処理する計画が必要です。大規模アップロードのためのApacheの設定
明らかに、これは私が私のサーバーに過負荷をかけるか、セキュリティホールを開くことなく、このような大容量のファイル転送を許可するように私のApacheを設定する方法の周りの懸念の多くの原因となります。
懸念1:私のシステムのメモリ制限
一つの特徴は、ユーザーがそれらをアップロードした後、そのファイルをバックダウンロードすることができるということです。セキュリティ上の問題のため、標準のダウンロード(ファイルへのリンクのみ)を使用することは避けました。他のユーザーがファイルをダウンロードすることはできません。私の解決策は、アップロードされたファイルをwww-root以外の保護されたディレクトリに保存し、PHPスクリプト経由でロードすることでした。
$fo = fopen($uploadDir.$file_name, "r");
while(!feof($fo)) {
$strang = fread($fo, 102400);
echo $strang;
ob_flush();
}
fclose($fo);
私はループに関数freadを入れて、一度にファイルの小さなチャンクを読み込むにそれをロックしました:そのPHPスクリプトは、ほとんどこのようになります。私のサーバーは4GBのRAMしか持っていないので、複数の人が同時にダウンロードできるようにする必要があります(おそらく最大20 ppl)。私の最初の質問は、一度に読み取るべきチャンクの大きさです。今すぐ1.5GBのファイルをダウンロードするのは、そのチャンクサイズのために辛いです。
懸念2:最大実行時間
アップロードの別の問題/このような大規模なファイルをダウンロードするには、最大実行時間です。私の内部ネットワークはすべてがスピードアップしていますが、接続が遅いユーザーのために準備する必要があります。私はローエンドのアップロードレートを1Mbpsに設定しています。これはアップロードに約35分です。寛大で、2倍の速さでダウンロードできますので、ダウンロードする時間は15分です。それは、30分に自分のmax_excution_timeを設定するために、セキュリティ上のリスクは
ですか?私のサーバー上で何かを殺すつもりですか?私はそれが悪い考えだと思う理由はありませんが、私の勇気は、私はスクリプトがそれを長く実行できるように私はばかげていると叫んでいるだけです。私がやろうとしていることをする良い方法はありますか?
私はいくつかの同様の質問を見たことがあり、そのほとんどはjavaやsilverlightのようなものを使用することを提案しました。私は、賢明な方法があれば、javaを避けるためにしたいと思います。私は現在、swfuploadと付随するjQueryプラグインを使用しています。
ファイルのダウンロード速度の問題については、私の古い回答が役に立つかもしれません:http://stackoverflow.com/questions/3697748/fastest-way-to-serve-a-file-using-php/3731639#3731639 –
その方法を愛する。保護されたディレクトリに自分のファイルがある場合は動作しますか?または、Webサーバーで利用可能にする必要がありますか?私はそれを今セットアップしているが、それは動作していない..実際にエラー情報を与えていない。 – jwegner
「X-SendFile」を使用していますか?このファイルは、Webサーバープロセスを実行しているユーザーが読むことができます。 –