Опубликовано Оставить комментарий

Кратко: Знакомство с NGINX Unit.

HighLoad++ 2017 Зал «Конгресс-Холл», 7 ноября.

0:40 Докладчик 1: Игорь Сысоев.

  • год основания Nginx inc. — 2011
  • офисы в: Сан-Франциско,  Москва, Ирландия, Сингапур
    • 180 сотрудников
  • Есть nginx open source  и есть Nginx+ коммерческий
  • Nginx Amplify — мониторинг, сбор статистики
  • NGINX Unit

1:26 Доклад о NGINX Unit

  • nginx open source, лицензирован под  Apache 2.0 unit.nginx.org
  • Это сервер приложений для  Python, Go, PHP
    • Планируется поддержка: Ruby, Java, node.js,  Net Core,  Perl
  • Настройка через JSON RESTful API

Ключевая особенность NGINX Unit — кофигурируется динамически.

2:54 UNIT Architecture

Конфигурация производится с помощью JSON. Процесс происходит извне, без аутентификации но с поддержкой ssl и т.д.

 

 

 

Main process —  единственный процесс, который работает под рутом. Остальные процессы все работают только под непривилегированными пользователями.

 

4:07  Основная работа прходит в процессе Router

Процесс Router мультитредовый, но каждый тред работатет со своим собсвтенным epoll, gq (4:20) .

Каждый тред обрабатывает тысячи соединений  в асинхронном режиме с помощью epoll?  и т.д.

5:54 Весь application code (php, python, Go)   запускается в отдельных процессах под разными пользователями.

Взаимодействие между прцессами  осуществляется при помощи socket pair (?) и сегментами разделяемой памяти.

5:59  Запуск интерпретаторов:

Запрос от клиента приходит в процесс router.  Router слушает, если процесс не  запущен, то запрос отправляется в main process, там загружается модуль с нужным интерпретатором, допутим php5.

Одновременно могут запускаться разные версии php, python  в разных процессах.

7:11  Приложения которые сами из себя представляют вебсервер ( Java, Go) запускаются с немного другими настройками.

Docs: unit.nginx.org

Code: hg.nginx.org/unit

github.com/nginx/unit

 

9:54 Конфигурация NGINX Unit

Докладчик 2: Николай Шадрин.

Исходники скачаны с github.

10:22  Стандартная сборка

Собираем сам юнитовский сервер:
 ./configure

Конфигуратор нужно запускать для каждого из требуемых языков:
./configure php
,  ./configure python
./configure python —config=python3.5-config

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

Что собирается после мейка:

12:07   ls -al ./build/unitd —control 8443   ( для тестовой демонстрации)

После старта   unitd
./build/unitd
появляются процессы unitd, controller, router:

 

14:09 пример конфигурации PHP

Внесение изменений в  конфигурацию:

curl  -X PUT -d @start.json 127.1:8443

Важно:

  • мы сконфигурировали новое приложение
  • не рестартовались ни роутер ни контроллер
  • запустили приложение php под пользователем php

15:37   Старт python

curl  -X PUT -d @/srv/python.json localhost:8443/applications/python1

Переопределение порта  python:

curl  -X -d PUT ‘»python1″‘  ‘127.1:8443/listeners/*:8300/application’

Аналогично можно запусить второй модуль python с другой версией.

19:59  Старт приложения Go c конфигурацией из строки:

curl  -X PUT -d ‘{«type»:»go»,»executable»:»/srv/go/hello»}’  http://localhost:8443/applications/go_hello_world

Вопрос: Зачем в языке Go сервер приложений ?
Ответ:  Появляется один и тот же http стэк для разных типов приложений, единая методика конфигураций, вне зависимости от используемых платформ.

22:49 Удаление модуля PHP:

curl -X DELETE  ‘127.1.:8443/applications/phpinfo’

 

Вопросы и ответы.

24:33
Вопрос: Как обновлять приложения?
Ответ: Собрать новый php и переконфигурировать.

25:37 
Вопрос: Есть ли web интерфейс ?
Ответ: Планируется, но его может писать кто угодно. Планируется также коммандлайн утилита для настройки

26:21
Вопрос: Есть ли поддержка цепочек приложений?
Ответ: Планируем создать секцию роутов, котрая позволит разруливать запросы по портам, урлам, хостам и т.д.

27:04
Вопрос: Возможно ли в приложении, куда из юнита были переданы данные, порождать потоки, делать что-то еще? Может ли данное приложение работать долго?
Ответ: В  PHP и python задается фиксированное количество workers. Go запускается один раз и порождает в себе необходимое количество модулей.

28:33
Вопрос:  Поддерживатеся ли авторизация при вызове конфигурации?
Ответ: Сейчас авторизации нет.  Планируем через сертификаты или адреса.

29:32
Вопрос:  Как удалять старые приложения?
Ответ: Планируется отдельное пространство имен для перезагрузки, удаления  и т.д.  Сейчас удалется все руками.

31:10
Вопрос: Как проверить новую конфигурацию перед запуском ?
Ответ: Синтаксически и логически проверка делается внутри контроллера.

32:38
Вопрос: Что будет если процесс приложения упадет?
Ответ: Главный процесс его перестартует

33:03
Вопрос: Можно ли делать горячий деплой без подмены портов, чятобы новое приложение появлялось, а старые коннекшены переводились но новое?
Ответ: Если нет сильных зависимостей, тогда можно пытаться делать подмены.

34:07
Вопрос: О проксировании Unit сервисом языка Java.
Ответ: Планируется сделать так же как с языком Go — как Application Server.

Присоединяйтесь:  Телеграм    Facebook    ВКонтакте

Добавить комментарий
Войти с помощью: