SlideShare a Scribd company logo
Видеохостинг своими
      руками


     Докладчик:
     Малкин Станислав




        Киев, 2012
Архитектура

• Морда видеохостинга
• Файловые сервера (связываются с
  кодирующим(-и) сервером(-ами) по NFS)
• Сервер для загрузки видео (используем
  http://pecl.php.net/package/uploadprogress)
• Сервер(-а) для кодирования видео
Путь и инструментарий

• ffmpeg
• nginx
• shell-скриптинг, perl
• плеер (uppod например) и клиентская
  часть
• ??????
• PROFIT!
FFMPEG
1.   Ставим из сорцов, предварительно скачав из git:
     git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

4.   Ключи сборки:
     --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --bindir=/usr/bin
     --incdir=/usr/include/ffmpeg --enable-libx264 --enable-postproc
     --enable-libxvid --enable-pthreads --enable-libvorbis --enable-gpl
     --enable-x11grab --enable-shared --enable-libmp3lame --enable-
     libtheora --enable-libfaac --enable-nonfree --enable-libopencore-
     amrnb --enable-libopencore-amrwb --enable-libgsm --enable-version3
     --enable-avfilter --enable-libspeex --enable-zlib --enable-
     libschroedinger --disable-encoder=libschroedinger --enable-libdc1394
     --enable-libdirac --disable-decoder=libdirac --enable-libopenjpeg
     --extra-cflags=-Wall --cc=ccache cc --enable-swscale --enable-libvpx
3. Ставим qt-faststart (для метаинформации с  конца
   mp4 контейнера в  начало) :
   make tools/qt-faststart

4. Кодируем видео:
   ffmpeg -i video.avi -y -vcodec libx264 –s 640x360 -vpre max –b 498k
   -threads 0 -r 29 -acodec libfaac -ab 128k -ar 44100 -ac 2 –f mp4
   temp.mp4

5. Перемещаем moov-атомы в начало файла:
   /usr/local/bin/qt-faststart temp.mp4 output.mp4

6. Делаем превьюшки:
    ffmpeg -ss 00:00:04 -i out.mp4 -vcodec mjpeg -vframes 1 -an -f
    rawvideo -s 176x99 output.jpg
NGINX
1. Ставим из сорцов с такими ключами сборки:
      --pid-path=/var/run/nginx.pid --with-file-aio --with-
      http_stub_status_module --with-http_flv_module --with-http_mp4_module
      --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-
      path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --http-log-
      path=/var/log/nginx/access.log --with-http_secure_link_module

2. Настраиваем псевдостриминг:
      location ~ .mp4$ { mp4; }

3. Добавляем статистику:
     server {
         listen 8888;
         server_name serverName;
         location / {
            stub_status on;
            access_log off;
         }
       }
4. Защищаемся от хотлинкинга (--with_http_secure_link_module):

location /video/ {
      rewrite ^/video/([w-_=]+)/(d+)/(.+)$ /storage/$3?s=$1&t=$2;
 }

location /storage/ {
      secure_link $arg_s,$arg_t;
      secure_link_md5 pass$uri$arg_t$remote_addr;

     if ($secure_link = "") {
         return 403;
     }

     if ($secure_link = "0") {
         return 410;
     }

     rewrite ^/storage/(.*)$ /storage/$1 break;

     root /disk1;
     internal;
     mp4;
     aio on;
     directio 4m;
     limit_rate_after 2m;
     set $limit_rate 1m;
     limit_conn dlconn 3;
     output_buffers 1 1m;
}
5. Пару советов по настройке и выбору железа:

    – Чем больше ядер у файлового раздающего сервера – тем лучше
      (воркеры выставляем в конфиге по количеству ядер -
      worker_processes 4)
    – Файловой системой лучше всего выбрать xfs (быстрая, без
      журналирования) и монтировать с –noatime
    – Обязательно использовать AIO, тем более, что nginx его
      поддерживает
    – Контент лучше всего дублировать на разные винты и отдавать его
      поочередно, таким образом балансируя нагрузку
    – Контент хранить в древовидной структуре (/ab/cd/ef/abcdef.mp4), а не
      держать в одной папке – можно будет обслужить большее
      количество клиентов
    – Ограничивать скорость отдачи видео и количество одновременных
      подключений – больше клиентов сможет потребить контент.
    – «Горячий контент» стоит отдавать с отдельных быстрых винтов,
      подойдет даже SSD
SHELL-скриптинг, PERL

• Кодирования видео с использованием очередей
• Скачивание видео по ссылке (YouTube,
  RuTube, Vimeo etc)
• Обнаружение горячего контента
• CDN для более «умной» раздачи контента



…об этом и другом в следующие разы 
Плеер и клиентская часть

• Выбрать подходящий плеер (рекомендую
  Uppod + Pro аккаунт) и настроить,
  использовать HTML5 + flash fallback

• Правильно закодировать ссылку к видео,
  чтобы защититься от хотлинкинга:
  public function secureLink($url) {
        $time = time() + 14400;
        $string = 'pass' .$url.$time.$_SERVER['REMOTE_ADDR'];
        $hash = md5($string, true);
        return $url.'/'.$hash.'/'.$time;
  }
Обратная связь:




Станислав Малкин
malkin.stanislav@gmail.com
http://malkin.com.ua




                         Киев, 2012

More Related Content

What's hot

High Availability в жизни обычного разработчика
High Availability в жизни обычного разработчикаHigh Availability в жизни обычного разработчика
High Availability в жизни обычного разработчика
Sumy PHP User Grpoup
 
Cпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложенияCпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложения
7bits
 
Thumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - AnsibleThumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - Ansible
Alexey Remnev
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
Badoo Development
 
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
Oleg Lipin
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
Ontico
 
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Minsk Linux User Group
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Ontico
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Ontico
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
mayperl
 
Беспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQLБеспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQL
Дмитрий Васильев
 
PostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimmPostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimm
Дмитрий Васильев
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиKirill Mokevnin
 
Слава Машканов — “Wubuntu”: Построение гетерогенной среды Windows+Linux на н...
Слава Машканов — “Wubuntu”: Построение гетерогенной среды  Windows+Linux на н...Слава Машканов — “Wubuntu”: Построение гетерогенной среды  Windows+Linux на н...
Слава Машканов — “Wubuntu”: Построение гетерогенной среды Windows+Linux на н...
Minsk Linux User Group
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решений
Lenvendo
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
mcroitor
 
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
Ontico
 
Scaling PostgreSQL
Scaling PostgreSQLScaling PostgreSQL
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Александр Сигачев
 

What's hot (20)

High Availability в жизни обычного разработчика
High Availability в жизни обычного разработчикаHigh Availability в жизни обычного разработчика
High Availability в жизни обычного разработчика
 
Cпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложенияCпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложения
 
Thumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - AnsibleThumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - Ansible
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
 
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
 
Беспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQLБеспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQL
 
PostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimmPostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimm
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статики
 
Слава Машканов — “Wubuntu”: Построение гетерогенной среды Windows+Linux на н...
Слава Машканов — “Wubuntu”: Построение гетерогенной среды  Windows+Linux на н...Слава Машканов — “Wubuntu”: Построение гетерогенной среды  Windows+Linux на н...
Слава Машканов — “Wubuntu”: Построение гетерогенной среды Windows+Linux на н...
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решений
 
WWW
WWWWWW
WWW
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
 
Scaling PostgreSQL
Scaling PostgreSQLScaling PostgreSQL
Scaling PostgreSQL
 
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
 

Viewers also liked

Webvideo, FFmpeg und Drupal
Webvideo, FFmpeg und DrupalWebvideo, FFmpeg und Drupal
Webvideo, FFmpeg und Drupal
Walter Ebert
 
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...Cisco Russia
 
CDN в России: от теории к практике (Ярослав Городецкий)
CDN в России: от теории к практике (Ярослав Городецкий)CDN в России: от теории к практике (Ярослав Городецкий)
CDN в России: от теории к практике (Ярослав Городецкий)Ontico
 
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Ontico
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)
Ontico
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Ontico
 
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Ontico
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Ontico
 
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Ontico
 
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Ontico
 

Viewers also liked (20)

video hostings architecture
video hostings architecturevideo hostings architecture
video hostings architecture
 
Webvideo, FFmpeg und Drupal
Webvideo, FFmpeg und DrupalWebvideo, FFmpeg und Drupal
Webvideo, FFmpeg und Drupal
 
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...
Лучшие практики и рекомендуемые дизайны по построению WAN-сетей на базе возмо...
 
CDN в России: от теории к практике (Ярослав Городецкий)
CDN в России: от теории к практике (Ярослав Городецкий)CDN в России: от теории к практике (Ярослав Городецкий)
CDN в России: от теории к практике (Ярослав Городецкий)
 
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
 
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
 
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
 
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
 
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
 
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
 

Similar to Видеохостинг своими руками

Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
Ontico
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Александр Егурцов
 
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр ТобольКадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
odnoklassniki.ru
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Yandex
 
стриминг видео на ок
стриминг видео на окстриминг видео на ок
стриминг видео на ок
Alexander Tobol
 
Хранилище 101
Хранилище 101Хранилище 101
Хранилище 101
Maxim Muzafarov
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2rit2011
 
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Ontico
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
poudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkgpoudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkg
Andrey Fesenko
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayAndrey Rebrov
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
Oleksandr Torosh
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor SysoevMedia Gorod
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
Ivan Grishaev
 
Varnish and Drupal.
Varnish and Drupal.Varnish and Drupal.
Varnish and Drupal.
Vlad Savitsky
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктуройdddpaul
 

Similar to Видеохостинг своими руками (20)

Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
Кадры решают все, или стриминг видео, Александр Тоболь (Одноклассники)
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр ТобольКадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
 
стриминг видео на ок
стриминг видео на окстриминг видео на ок
стриминг видео на ок
 
Хранилище 101
Хранилище 101Хранилище 101
Хранилище 101
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
poudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkgpoudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkg
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Varnish and Drupal.
Varnish and Drupal.Varnish and Drupal.
Varnish and Drupal.
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
 

Видеохостинг своими руками

  • 1. Видеохостинг своими руками Докладчик: Малкин Станислав Киев, 2012
  • 2. Архитектура • Морда видеохостинга • Файловые сервера (связываются с кодирующим(-и) сервером(-ами) по NFS) • Сервер для загрузки видео (используем http://pecl.php.net/package/uploadprogress) • Сервер(-а) для кодирования видео
  • 3. Путь и инструментарий • ffmpeg • nginx • shell-скриптинг, perl • плеер (uppod например) и клиентская часть • ?????? • PROFIT!
  • 4. FFMPEG 1. Ставим из сорцов, предварительно скачав из git: git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 4. Ключи сборки: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --bindir=/usr/bin --incdir=/usr/include/ffmpeg --enable-libx264 --enable-postproc --enable-libxvid --enable-pthreads --enable-libvorbis --enable-gpl --enable-x11grab --enable-shared --enable-libmp3lame --enable- libtheora --enable-libfaac --enable-nonfree --enable-libopencore- amrnb --enable-libopencore-amrwb --enable-libgsm --enable-version3 --enable-avfilter --enable-libspeex --enable-zlib --enable- libschroedinger --disable-encoder=libschroedinger --enable-libdc1394 --enable-libdirac --disable-decoder=libdirac --enable-libopenjpeg --extra-cflags=-Wall --cc=ccache cc --enable-swscale --enable-libvpx
  • 5. 3. Ставим qt-faststart (для метаинформации с  конца mp4 контейнера в  начало) : make tools/qt-faststart 4. Кодируем видео: ffmpeg -i video.avi -y -vcodec libx264 –s 640x360 -vpre max –b 498k -threads 0 -r 29 -acodec libfaac -ab 128k -ar 44100 -ac 2 –f mp4 temp.mp4 5. Перемещаем moov-атомы в начало файла: /usr/local/bin/qt-faststart temp.mp4 output.mp4 6. Делаем превьюшки: ffmpeg -ss 00:00:04 -i out.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 176x99 output.jpg
  • 6. NGINX 1. Ставим из сорцов с такими ключами сборки: --pid-path=/var/run/nginx.pid --with-file-aio --with- http_stub_status_module --with-http_flv_module --with-http_mp4_module --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log- path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --http-log- path=/var/log/nginx/access.log --with-http_secure_link_module 2. Настраиваем псевдостриминг: location ~ .mp4$ { mp4; } 3. Добавляем статистику: server { listen 8888; server_name serverName; location / { stub_status on; access_log off; } }
  • 7. 4. Защищаемся от хотлинкинга (--with_http_secure_link_module): location /video/ { rewrite ^/video/([w-_=]+)/(d+)/(.+)$ /storage/$3?s=$1&t=$2; } location /storage/ { secure_link $arg_s,$arg_t; secure_link_md5 pass$uri$arg_t$remote_addr; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } rewrite ^/storage/(.*)$ /storage/$1 break; root /disk1; internal; mp4; aio on; directio 4m; limit_rate_after 2m; set $limit_rate 1m; limit_conn dlconn 3; output_buffers 1 1m; }
  • 8. 5. Пару советов по настройке и выбору железа: – Чем больше ядер у файлового раздающего сервера – тем лучше (воркеры выставляем в конфиге по количеству ядер - worker_processes 4) – Файловой системой лучше всего выбрать xfs (быстрая, без журналирования) и монтировать с –noatime – Обязательно использовать AIO, тем более, что nginx его поддерживает – Контент лучше всего дублировать на разные винты и отдавать его поочередно, таким образом балансируя нагрузку – Контент хранить в древовидной структуре (/ab/cd/ef/abcdef.mp4), а не держать в одной папке – можно будет обслужить большее количество клиентов – Ограничивать скорость отдачи видео и количество одновременных подключений – больше клиентов сможет потребить контент. – «Горячий контент» стоит отдавать с отдельных быстрых винтов, подойдет даже SSD
  • 9. SHELL-скриптинг, PERL • Кодирования видео с использованием очередей • Скачивание видео по ссылке (YouTube, RuTube, Vimeo etc) • Обнаружение горячего контента • CDN для более «умной» раздачи контента …об этом и другом в следующие разы 
  • 10. Плеер и клиентская часть • Выбрать подходящий плеер (рекомендую Uppod + Pro аккаунт) и настроить, использовать HTML5 + flash fallback • Правильно закодировать ссылку к видео, чтобы защититься от хотлинкинга: public function secureLink($url) { $time = time() + 14400; $string = 'pass' .$url.$time.$_SERVER['REMOTE_ADDR']; $hash = md5($string, true); return $url.'/'.$hash.'/'.$time; }