nginxで大きなファイルをダウンロードする際のファイル破損とファイルサイズの不一致の問題を解決する

WBOY
リリース: 2016-07-29 09:05:49
オリジナル
2903 人が閲覧しました

今日、友人が問題を報告しました。Web ページに 2MB のファイルがアップロードされたが、そのファイルは 64KB しかなく、開けなかったそうです。バグが存在し、必ず出現することを確認した後、私はデバッグとバグ解決の道を歩み始めました。

1. システムは nginx+php+mysql です。経験から判断すると、mysql とは関係がないため、無視して構いません。
2. PHP Web ページから 2MB のファイルをアップロードした後、ファイルをサーバー上で直接開きます。ファイルは通常どおり表示でき、元のファイルと同じバイナリです。
3. 別のブラウザと別のコンピュータを使用して、PHP Web ページからファイルを繰り返しダウンロードすると、ダウンロードされたファイルがわずか 64 KB であることがわかります。
4. 90KBのみのファイルに変更し、PHPのWebページからアップロード、ダウンロードしても異常はありません。
上記の 4 点により、基本的に nginx に問題があると判断できます。この時点で、nginx ログ ファイルを開き、次のエラー ログを見つけます。
[crit] 21636#0: *843968 open() “/home/www/local/nginx/fastcgi_temp/0/11/0000000110” がアップストリームの読み取り中に失敗しました (13: 許可が拒否されました)。 fastcgi_temp フォルダを操作するための権限が不足しているため、正常なファイルが取得できないため、フォルダに権限を付与すると問題は解決すると推測できます。

振り返ってみると、その理由は何でしょうか?

nginx 構成ファイルを表示すると、次の段落が見つかります:

fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; **fastcgi_buffer_size 64k; fastcgi_buffers 4 64k;**
fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; ダウンロードが失敗するたびに、ファイル サイズは常に 64 KB になりますが、これはこれに関連しているはずです。 nginx は、fastcgi_buffer_size で指定されたサイズのバッファを使用して、fastcgi ストリームのコンテンツをキャッシュすることがわかります。サイズがこのサイズを超えると、fastcgi_buffers で指定された数とサイズのバッファーが引き続き適用されます。それでもこのサイズを超える場合は、超過したコンテンツが一時ファイルに書き込まれます。つまり、この場合、nginx はまず 64K バッファを使用して fastcgi ストリームの最初の部分をバッファリングし、その後、バッファリングのために最大 4*64K=256K バッファを適用します。それを超えると、一時ファイルが書き込まれます。したがって、256K を超えるファイルをダウンロードする場合は、一時フォルダーをバッファリングに使用する必要があり、ここでの操作権限がないため、この問題が発生します。

')​​.addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i
').text(i)); }; $numbering.fadeIn(1700); }); });

上記では、nginx で大きなファイルをダウンロードする際のファイル破損とファイル サイズの不一致に対する解決策を、問題の側面も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート