Мое веб-приложение позволяет пользователям загружать файлы, которые хранятся на s3, через мои серверы. Когда пользователь запрашивает файл, мой веб-сервер извлекает его из s3, а затем отправляет его клиенту.
Недавно я развернул балансировщик нагрузки, сделав мои текущие настройки следующим образом:
Обратите внимание, что в настоящее время у меня есть только один веб-сервер для упростить отладку.
proxy_read_timeout 600s;
в /etc/nginx/nginx.confДля справки, функция, выполняемая на веб-сервере, для этого:
public function show($projectID, $documentID, $revisionID, $fileID)
{
$fileEntry = File::find($fileID);
$path = $fileEntry->path();
$file = Storage::get($path);
$size = Storage::size($path);
return Response::make($file, 200)
->header('Content-Type', $fileEntry->mime)
->header('Content-Disposition', 'attachment; filename="' . $fileEntry->original_filename . '"')
->header('Content-Length:', $size);
}
Я понимаю, что я дважды обрабатываю файлы и в будущем переключится на подписанные перенаправления URL-адресов s3, но есть другие части приложения, где это нецелесообразно (захват коллекции файлов, их архивирование и отправка клиенту), и поэтому хотелось бы получить некоторое понимание.
Что может быть причина этой проблемы? Я не думаю, что когда-либо сталкивался с этой проблемой до развертывания балансировщика нагрузки.
Если я загружаю файл прямо из s3, время загрузки составляет лишь часть от общего времени при передаче через мой сервер, поэтому я не думаю, что проблема заключается в двойной обработке. Может ли это быть связано с буфером или размером памяти?
Дополнительная информация:
Хорошая правка, все намного яснее.
Похоже, это тайм-аут приложения в PHP. Я предполагаю, что PHP полностью загружает большие файлы во временное место, а затем возвращает их, а не передает их обратно напрямую. Этим объясняется задержка, но не столько низкая скорость. Я даже не знаю, практична ли прямая потоковая передача прямо с S3 обратно через ваш стек - исследуйте, если требуется (вами). Я бы также посмотрел, имеет ли PHP5 значение, я обнаружил, что PHP7 менее надежен в нескольких крайних случаях.
Я бы отслеживал точное время, когда запросы приходят, попадают на каждый сервер и ответы возвращаются каждый сервер, чтобы вы могли полностью отслеживать запросы. Это особенно верно для уровня PHP: добавьте журналирование, когда сервер приложений получает запрос, когда он получает запрос от S3 и когда он начинает отправлять его обратно клиенту.
Скорость загрузки немного озадачивает. Я бы нашел способ проверить скорость между вашим PHP-сервером и S3 - сделайте завиток или что-то в этом роде - это может быть простая проблема с пропускной способностью или задержка, уменьшающая доступную пропускную способность. Обходной путь может заключаться в использовании CloudFront, но, вероятно, нет, поскольку это ускорит загрузку только во второй раз, когда они запрашиваются, а не в первый раз.
После того, как вы сделали все это, если вы еще не разработали, опубликуйте информацию, которую обнаружить - особенно точное время, когда несколько запросов попадают на каждый уровень, и время, когда ответы возвращаются.