SlideShare a Scribd company logo
Как и зачем создавать NginX-модуль
- теория, практика, профит
Часть вторая
Сошников Василий, Mail.Ru Group
Agenda
• Введение
• Upstream (Proxy handler)
• Преобразование контента на лету
• Коротко о Shared memory
• CDN Video, аналитика и кэширование
Введение
Архитектура NginX
core
http upstream script
NginX
modules
Configuration
ngx_http_NAME_{main, srv, loc}_conf_t
Code
ngx_http_NAME_t
ngx_http_NAME_function(…)
Code style
Chain of responsibility
http
NginX
Module 1 Module N
Request
Reply
Next Next
Аналогия
Phases, всему свое время и место
NginX
Module 1 Module N
Next
Phase 1
Module 1 Module N
Next
Phase N
Доступные фазы
Файл: nginx/src/http/
ngx_http_core_module.h
[ Flags
]
[ Ptrs
]
Chain buffer
Файл: nginx/src/core/ngx_buf.h
Upstream (Proxy handler)
Анатомия
+ upstream Keepalive module
Application serverHTTP
Application server
Application server
Application server
Application server
Application server
Native protocol
Proxy & balancing
Инсталляция
- Регистрируем новую директиву и
handler [1]
- Инициализируем новый upstream [2]
- Добавляем новый handler [3]
[1]
[2]
[3]
Обработка контента
- Инициализируется при запросе [1]
- Upstream & Downstream инициализируется при запросе, либо
берется из модуля Upstream KeepAlive [2]
- Handlers (ngx_upstream_t::*) [3]:

create_request - создание запроса к backend.


reinit_request - reset запроса к backend (вызывается до
create_request).


process_header - обработка headers от backend.
abort_request - клиент отменил запрос.
finalize_request - nginx закончил читать из backend.
input_filter_ctx - контекст input handlers(void *).
input_filter_init[4] - инициализация фильтра.
input_filter[5] - преобразование ответа от backend.
- Вычитываем тело, которое отправил клиент [6].
- В ngx_upstream_t::buffer хранится ответ от backend.
[1]
[2]
[3]
[5]
[4]
[6]
Преобразование контента на лету
Анатомия
top_body_filter
Next
Body filters chain
ВАШ_body_filter
Инсталляция
- Регистрация модуля и
postconfiguration handler [1]
- Добавление в handler chain [2]
Внимание



Порядок модулей в chain не
гарантируется (!)
[1]
[2]
Обработка контента
Say hello to a stream parsing… (C)

О чем стоит помнить



- Все chain, все кусочками.
- ngx_buf_s::sync = 1, если у вас пустой
chain buffer.
- Иногда лучше использовать malloc,
realloc, free вместо chain buffer.
- Добавляйте кучу debug’а.
- Результатом работы предыдущего
модуля может быть поломка вашего.
Коротко о shared memory
Анатомия
HTTP
nginx-based service (!)
Shared Memory
CDN Video, аналитика и кэширование
Задача
• Ускорить Wowza Media Stream Server путем эффективного
кэширования контента на edge-серверах, но без потери
функциональности.
Решение в лоб
Edge / Front Edge / Cache OriginClient
Wowza
- Проверка токенов

- Роутинг

- Failover
- Кэширование (.ts-файлов)

- Инвалидация кэша
- Apple HLS
- RTMP
- DASH
Проблемы, или то, что мы теряем
• Wowza Media Stream
• Аналитика
• Биллинг
• Трекинг
Правильное решение
Edge / Front Edge / Cache OriginClient
Wowza
Плюс

————————————

- трекинг пользователей (!)

- специальное логирование в формате wowza(!)
Трекинг
- Генерация уникального session id
- Должно быть отключаемо
(контролируем через nginx.conf)
- m3u8-файлы не кэшируются (!)
M3u8-файлы
Wowza
GET /playlist.m3u8&token=STR&…
GET /playlist.m3u8?session_id=NUM&token=STR…
Wowza
GET /playlist.m3u8?session_id=NUM&…

— Контент файла —

#EXTM3U

chunklist_w1447934753_b0001.m3u8?session_id=NUM?…n

…
Запрос Ответ
Логирование
- В формате Wowza (!)
- analytics.log
- access.log
- примеры на картинке слева
- Трекинг событий (start, play, stop …)
- Локальный Nginx-based сервис для
логирования
Сбор и агрегация логов
Edge / FrontClient
- Контроль TTL сессий

- Запись в логи

- Ротация логово
Shared memory queue
statagetnd Файлы Сборщик / Аргрегатор
СУБД / GUI / Отчеты / Биллинг
- Дедубликация (destroy, stop)

- Много разных агрегаций

- Сборка логов с edge-фронтов
…
Решено! Но вскрылись недостатки
• Wowza Media Stream Server все еще чувствует себя
плохо из-за запросов m3u8-файлов.
Фикс — перезаписываем контент кэша при
запросе
Edge / Front Edge / Cache OriginClient
Wowza
Плюс

————————————

- преобразование m3u8-файлов на лету

- кэшируем m3u8-файлы с очень маленьким TTL
Перезаписываем
контент
- Парсим m3u8-файл из кэша (!)
- Обновляем URI-аргументы в файле
- Отдаем клиенту измененный контент
Cache
GET /playlist.m3u8&token=STR&…
GET /playlist.m3u8?session_id=NUM&token=STR…
Cache
GET /playlist.m3u8?session_id=NUM&…

— Контент файла —

#EXTM3U

chunklist_w1447934753_b0001.m3u8?{REWRITE ARGS}n

…
Запрос Ответ
Схема
Ссылки
https://github.com/dedok/nginx-tutorials — примеры с прошлого выступления.


https://github.com/tarantool/nginx_upstream_module — пример upstream-модуля.
https://www.nginx.com/resources/wiki/modules/ — библиотека знаний и модулей.
https://github.com/nginx/nginx — исходники nginx.



https://en.wikipedia.org/wiki/HTTP_Live_Streaming — о HLS.

Вопросы & Контакты
• GitHub
• https://github.com/dedok
• Twitter
• https://twitter.com/vasayso
• @vasayso
• Telegram
• vasily_soshnikov

More Related Content

PDF
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
PDF
Настройка Kubernetes: tips ans tricks
PPTX
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
 
PDF
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
 
PPT
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
PDF
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
PPTX
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
PPTX
Опыт построения СХД на базе Windows Server для использования в публичном обла...
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Настройка Kubernetes: tips ans tricks
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
 
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
Опыт построения СХД на базе Windows Server для использования в публичном обла...

What's hot (20)

PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PPTX
Nutanix Acropolis - облако на базе KVM под ключ, Максим Шапошников (Nutanix)
PPTX
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
PPTX
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
PPTX
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
PDF
Механика DDoS (Александр Крижановский)
PDF
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
PDF
Чему мы научились разрабатывая микросервисы?
PDF
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
PDF
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
PPTX
Велосипед уже изобретен. Что умеют промышленные СХД? / Антон Жбанков (Nutanix)
PDF
Максим Дунин, Nginx, Inc.
PPTX
Модификации KVM для работы в кластере, Андрей Шетухин
PPTX
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
PDF
Управление контейнерами в облаках
PPT
Распределенное хранилище Ceph. Обзор и практические способы использования
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Nutanix Acropolis - облако на базе KVM под ключ, Максим Шапошников (Nutanix)
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
Механика DDoS (Александр Крижановский)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
Чему мы научились разрабатывая микросервисы?
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Велосипед уже изобретен. Что умеют промышленные СХД? / Антон Жбанков (Nutanix)
Максим Дунин, Nginx, Inc.
Модификации KVM для работы в кластере, Андрей Шетухин
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Управление контейнерами в облаках
Распределенное хранилище Ceph. Обзор и практические способы использования
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Современная операционная система: что надо знать разработчику / Александр Кри...
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Ad

Viewers also liked (20)

PDF
Как писать сервис, поддержка которого не превращается в ад / Антон Резников, ...
PDF
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
PDF
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
PPTX
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
PDF
Развитие баз данных в Dropbox. Путь от одной глобальной базы MySQL к 6000 шар...
PDF
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
PPTX
Организации в бирюзовом цвете / Мария Груздева (НИУ ВШЭ)
PPTX
Встреча докладчиков Hl++ 2017
PPTX
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
PPTX
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
PPTX
Как построить хороший performance review: опыт Badoo / Алексей Рыбак (Badoo)
PPTX
WAMP[-proto] как основа композитных SOA-приложений и его имплементация на Lua...
PDF
Проксирование HTTP-запросов web-акселератором / Александр Крижановский (Tempe...
PDF
NoSQL Best Practices for PostgreSQL / Дмитрий Долгов (Mindojo)
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
PDF
Database First! О распространённых ошибках использования РСУБД / Николай Само...
PDF
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
PDF
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
PDF
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
PDF
После подключения DDoS-защиты: как "положат" Ваши ресурсы / Рамиль Хантимиров...
Как писать сервис, поддержка которого не превращается в ад / Антон Резников, ...
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
Развитие баз данных в Dropbox. Путь от одной глобальной базы MySQL к 6000 шар...
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Организации в бирюзовом цвете / Мария Груздева (НИУ ВШЭ)
Встреча докладчиков Hl++ 2017
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Как построить хороший performance review: опыт Badoo / Алексей Рыбак (Badoo)
WAMP[-proto] как основа композитных SOA-приложений и его имплементация на Lua...
Проксирование HTTP-запросов web-акселератором / Александр Крижановский (Tempe...
NoSQL Best Practices for PostgreSQL / Дмитрий Долгов (Mindojo)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Database First! О распространённых ошибках использования РСУБД / Николай Само...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
После подключения DDoS-защиты: как "положат" Ваши ресурсы / Рамиль Хантимиров...
Ad

Similar to Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Василий Сошников (Mail.Ru) (14)

PDF
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
PDF
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
PDF
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
PDF
07 - Web-технологии. Web-сервера
PPT
История проекта, который никогда не падает / Андрей Шетухин
PDF
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
PDF
Алексей Акулович
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
PPTX
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
ODP
Nginx Igor Sysoev
PDF
Что такое Highload? Секреты высокой нагрузки
PDF
Tech Talks @NSU: Что такое Highload? Секреты высокой нагрузки.
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
07 - Web-технологии. Web-сервера
История проекта, который никогда не падает / Андрей Шетухин
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Алексей Акулович
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Nginx Igor Sysoev
Что такое Highload? Секреты высокой нагрузки
Tech Talks @NSU: Что такое Highload? Секреты высокой нагрузки.

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Василий Сошников (Mail.Ru)