Системы хранения и отдачи файлов — это отдельная часть в практике построения масштабируемых систем. Сегодня рассмотрим вопросы отдачи медиа (и не только) файлов с помощью Web сервера
На что следует обратить внимание для оптимальной настройки
Для начала выделим особенности нашей задачи:
- Нужно параллельно отдавать много файлов
- Файлы в большинстве своем крупные (более 5 Мб), но есть и мелкие
- Мы отдаем потоковое видео и нам необходимо обеспечить его комфортный просмотр
- Мы отдаем звуковые файлы и необходимо обеспечить их комфортное прослушивание
Теперь рассмотрим настройки, на которые следует обратить внимание:
sendfile
Как обычно работает Web сервер, при передаче файла:
- открыется исходный файл (на диске)
- открывается файл назначения (сетевое соединение)
- Читается блок данных, копируется в буфер и передается по назначению, пока не достигнут конец файла
- Закрываются оба файла
Это означает, что происходит дополнительное копирование, которое вынужден делать Web сервер. В этом случае сервер делает системные вызовы read и write. Системный вызов sendfile служит как раз для того, чтобы избежать излишнего копирования и обеспечить прямую передачу файла. Включайте эту опцию (всегда):
sendfile on;
tcp_nopush
Директива разрешает или запрещает использовать опции TCP_NOPUSH во FreeBSD или TCP_CORK в Linux. “tcp_nopush on” полезно для sendfile(),
Включение этой опции позволяет:
- передавать заголовок ответа и начало файла в одном пакете
- передавать файл в полных пакетах
tcp_nopush on;
keepalive_timeout
Если у Вас на одной странице отдается множество файлов (например, малые версии фоток или скриншоты видео), то следует использовать keepalive соединения. Это поможет сэкономить на инициализации нового соединения при запросе каждой картинки, взамен пользоваться одним. Значение это опции имеет смысл ставить в пределах 20…30 секунд:
keepalive_timeout 30;
tcp_nodelay
Директива разрешает или запрещает использовать опцию TCP_NODELAY (при переходе соединения в состояние keep-alive). Перед переходом соединения в keepalive
tcp_nodelay on;
directio
Эта опция позволяет включить прямое чтение без обращение в кеш операционной системы. Это полезно для больших файлов, поскольку операционный кеш для них малоэффективен. Опция позволяет задать минимальный размер для включения режима прямого чтения:
directio 10m;
expires
Поскольку мы имеем дело со статическими файлами, и есть вероятность того, что один и тот же пользователь сможет несколько раз запросить один и тот же файл, следует включить кеширование на браузере. Это достигается установкой опции “expires max”, которая отправит браузеру нужные заголовки:
expires max;
limit_rate
Это достаточно важная опция. Она позволяет ограничить скорость отдачи файлов. В том случае, если Вы отдаете потоковое видео, либо музыку, Вам следует установить ограничения на скорость отдачи. Это позволит сэкономить канал и обслужить больше клиентов:
limit_rate 196K;
Эта опция работает только в рамках одного запроса, а не клиента. Если Вы хотите поставить ограничение на клиента, следует использовать переменную:
set $limit_rate 196K;
В
limit_rate_after 1m;
Related posts:
Комментариев нет:
Отправить комментарий