今日、友人が問題を報告しました。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 フォルダを操作するための権限が不足しているため、正常なファイルが取得できないため、フォルダに権限を付与すると問題は解決すると推測できます。
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 チュートリアルに興味のある友人に役立つことを願っています。