Игорь Сысоев представил второй публичный выпуск сервера приложений NGINX Unit, в рамках которого развивается решение для обеспечения запуска web-приложений на различных языках программирования. NGINX Unit обслуживает отдачу динамического контента самостоятельно, но также может работать в тандеме с http-сервером nginx, который может выступать в роли балансировщика, кэша или сервера для отдачи статического контента. Проект пока находится на стадии бета-тестирования и не рекомендован для промышленного использования. Код написан на языке Си и распространяется под лицензией Apache 2.0.

NGINX Unit предоставляет возможность динамического изменения параметров запуска приложений через специальный RESTful JSON API, без необходимости правки файлов конфигурации и перезапуска (ответ на потребность пользователей nginx в возможностях “.htaccess”). Особенностью реализации является то, что изменение настроек не приводит к перезапуску рабочих процессов – меняются только содержимое структур в памяти, что сводит к минимуму накладные расходы и позволяет менять параметры с любой интенсивностью.

RESTful API позволяет управлять работой сервера приложений удалённо и централизовано. Доступ к API может быть организован через UNIX domain socket или TCP. Одновременно под управлением NGINX Unit может выполняться несколько приложений на разных языках программирования, в том числе могут сочетаться разные версии языков (например, PHP 5 и PHP 7, Python 2.7 и Python 3.3). В настоящий момент поддерживаются Python, PHP и Go.

Функциональность NGINX Unit образует несколько процессов: процесс управления конфигурацией, основной процесс для запуска обработчиков web-приложений и многопоточный процесс для маршрутизации вызовов, транслирующий внешние запросы к web-приложениям. Процесс маршрутизации в свою очередь состоит из координатора запросов и рабочих нитей, которые принимают запросы клиентов, направляют их web-приложениям и возвращают ответ. Каждая рабочая нить может работать в асинхронном режиме и обслуживать тысячи одновременных соединений. Под root выполняется только главный управляющий процесс, а все остальные обработчики запускаются под отдельными непривилегированными пользователями.

В новом выпуске улучшена поддержка пакетов на языке Go, добавлен режим постоянного сохранения конфигурации, улучшена обработка ошибок в конфигурации, добавлено свойство для установки таймаута выполнения запроса приложением, налажена обработка POST-запросов в приложениях на PHP. Из планов на будущее отмечается поддержка JavaScript/Node.js, Java и Ruby, возможность динамического управления процессами приложений, поддержка TLS, средства для маршрутизации и проксирования вызовов для TCP, HTTP, HTTPS, HTTP/2.