Обратный прокси-сервер Nginx, из-за которого загрузка файлов требует слишком много времени для запуска

Обзор

Мое веб-приложение позволяет пользователям загружать файлы, которые хранятся на s3, через мои серверы. Когда пользователь запрашивает файл, мой веб-сервер извлекает его из s3, а затем отправляет его клиенту.

Недавно я развернул балансировщик нагрузки, сделав мои текущие настройки следующим образом:

Web app Server setup

Обратите внимание, что в настоящее время у меня есть только один веб-сервер для упростить отладку.

  • Добавьте proxy_read_timeout 600s; в /etc/nginx/nginx.conf
  • На веб-сервере:

    • Клиент нажимает ссылку uri, которая попадает на мой сервер
    • Мой веб-сервер переходит к базе данных и получает информацию, такую ​​как имя хешированного файла и путь для сервера базы данных.
    • Затем веб-сервер получает файл из S3.
    • Веб-сервер отвечает файлом как загрузкой на первоначальный запрос:

    Для справки, функция, выполняемая на веб-сервере, для этого:

    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, время загрузки составляет лишь часть от общего времени при передаче через мой сервер, поэтому я не думаю, что проблема заключается в двойной обработке. Может ли это быть связано с буфером или размером памяти?

    Дополнительная информация:

    • Laravel forge, используемый для подготовки и серверов.
    • Завершение SSL на балансировщике нагрузки
    • Веб-приложение Laravel
    • Все Linode размещены в Центр обработки данных в Сингапуре
    • Регион S3 - Сидней
    • Проблемы наблюдались при крайне низком трафике (до 1 клиента)
  • 2
    задан 23 March 2016 в 01:54
    1 ответ

    Хорошая правка, все намного яснее.

    Похоже, это тайм-аут приложения в PHP. Я предполагаю, что PHP полностью загружает большие файлы во временное место, а затем возвращает их, а не передает их обратно напрямую. Этим объясняется задержка, но не столько низкая скорость. Я даже не знаю, практична ли прямая потоковая передача прямо с S3 обратно через ваш стек - исследуйте, если требуется (вами). Я бы также посмотрел, имеет ли PHP5 значение, я обнаружил, что PHP7 менее надежен в нескольких крайних случаях.

    Я бы отслеживал точное время, когда запросы приходят, попадают на каждый сервер и ответы возвращаются каждый сервер, чтобы вы могли полностью отслеживать запросы. Это особенно верно для уровня PHP: добавьте журналирование, когда сервер приложений получает запрос, когда он получает запрос от S3 и когда он начинает отправлять его обратно клиенту.

    Скорость загрузки немного озадачивает. Я бы нашел способ проверить скорость между вашим PHP-сервером и S3 - сделайте завиток или что-то в этом роде - это может быть простая проблема с пропускной способностью или задержка, уменьшающая доступную пропускную способность. Обходной путь может заключаться в использовании CloudFront, но, вероятно, нет, поскольку это ускорит загрузку только во второй раз, когда они запрашиваются, а не в первый раз.

    После того, как вы сделали все это, если вы еще не разработали, опубликуйте информацию, которую обнаружить - особенно точное время, когда несколько запросов попадают на каждый уровень, и время, когда ответы возвращаются.

    1
    ответ дан 3 December 2019 в 12:41

    Теги

    Похожие вопросы