Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

324 views

Published on

HighLoad++ 2017

Зал Дели + Калькутта, 7 ноября, 15:00

Тезисы:
http://www.highload.ru/2017/abstracts/2940.html

Почти год назад я выступил с докладом 'Как и зачем создавать NginX-модуль - теория, практика, профит'. У меня не получилось рассказать обо всех возможностях Nginx и, уверяю вас, в этом докладе у меня это тоже не получится - тема слишком большая!

Сразу перейдем к делу. "Так что нового будет в этом докладе?" - спросите вы. В нем будут ответы на вопросы, на которые я не успел ответить в прошлом году, а именно:
- Как и зачем создавать upstream-модули?
...

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Как и зачем создавать NginX-модуль - теория, практика, профит Часть вторая Сошников Василий, Mail.Ru Group
  2. 2. Agenda • Введение • Upstream (Proxy handler) • Преобразование контента на лету • Коротко о Shared memory • CDN Video, аналитика и кэширование
  3. 3. Введение
  4. 4. Архитектура NginX core http upstream script NginX modules
  5. 5. Configuration ngx_http_NAME_{main, srv, loc}_conf_t Code ngx_http_NAME_t ngx_http_NAME_function(…) Code style
  6. 6. Chain of responsibility http NginX Module 1 Module N Request Reply Next Next Аналогия
  7. 7. Phases, всему свое время и место NginX Module 1 Module N Next Phase 1 Module 1 Module N Next Phase N
  8. 8. Доступные фазы Файл: nginx/src/http/ ngx_http_core_module.h
  9. 9. [ Flags ] [ Ptrs ] Chain buffer Файл: nginx/src/core/ngx_buf.h
  10. 10. Upstream (Proxy handler)
  11. 11. Анатомия + upstream Keepalive module Application serverHTTP Application server Application server Application server Application server Application server Native protocol Proxy & balancing
  12. 12. Инсталляция - Регистрируем новую директиву и handler [1] - Инициализируем новый upstream [2] - Добавляем новый handler [3] [1] [2] [3]
  13. 13. Обработка контента - Инициализируется при запросе [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]
  14. 14. Преобразование контента на лету
  15. 15. Анатомия top_body_filter Next Body filters chain ВАШ_body_filter
  16. 16. Инсталляция - Регистрация модуля и postconfiguration handler [1] - Добавление в handler chain [2] Внимание
 
 Порядок модулей в chain не гарантируется (!) [1] [2]
  17. 17. Обработка контента Say hello to a stream parsing… (C)
 О чем стоит помнить
 
 - Все chain, все кусочками. - ngx_buf_s::sync = 1, если у вас пустой chain buffer. - Иногда лучше использовать malloc, realloc, free вместо chain buffer. - Добавляйте кучу debug’а. - Результатом работы предыдущего модуля может быть поломка вашего.
  18. 18. Коротко о shared memory
  19. 19. Анатомия HTTP nginx-based service (!) Shared Memory
  20. 20. CDN Video, аналитика и кэширование
  21. 21. Задача • Ускорить Wowza Media Stream Server путем эффективного кэширования контента на edge-серверах, но без потери функциональности.
  22. 22. Решение в лоб Edge / Front Edge / Cache OriginClient Wowza - Проверка токенов
 - Роутинг
 - Failover - Кэширование (.ts-файлов)
 - Инвалидация кэша - Apple HLS - RTMP - DASH
  23. 23. Проблемы, или то, что мы теряем • Wowza Media Stream • Аналитика • Биллинг • Трекинг
  24. 24. Правильное решение Edge / Front Edge / Cache OriginClient Wowza Плюс
 ————————————
 - трекинг пользователей (!)
 - специальное логирование в формате wowza(!)
  25. 25. Трекинг - Генерация уникального session id - Должно быть отключаемо (контролируем через nginx.conf) - m3u8-файлы не кэшируются (!)
  26. 26. 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
 … Запрос Ответ
  27. 27. Логирование - В формате Wowza (!) - analytics.log - access.log - примеры на картинке слева - Трекинг событий (start, play, stop …) - Локальный Nginx-based сервис для логирования
  28. 28. Сбор и агрегация логов Edge / FrontClient - Контроль TTL сессий
 - Запись в логи
 - Ротация логово Shared memory queue statagetnd Файлы Сборщик / Аргрегатор СУБД / GUI / Отчеты / Биллинг - Дедубликация (destroy, stop)
 - Много разных агрегаций
 - Сборка логов с edge-фронтов …
  29. 29. Решено! Но вскрылись недостатки • Wowza Media Stream Server все еще чувствует себя плохо из-за запросов m3u8-файлов.
  30. 30. Фикс — перезаписываем контент кэша при запросе Edge / Front Edge / Cache OriginClient Wowza Плюс
 ————————————
 - преобразование m3u8-файлов на лету
 - кэшируем m3u8-файлы с очень маленьким TTL
  31. 31. Перезаписываем контент - Парсим m3u8-файл из кэша (!) - Обновляем URI-аргументы в файле - Отдаем клиенту измененный контент
  32. 32. 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
 … Запрос Ответ Схема
  33. 33. Ссылки 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.

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

×