Nginx Unit
Nginx Unit — это легковесное, многопроцессное серверное приложение с открытым исходным кодом, предназначенное для запуска и обслуживания веб-приложений на различных языках программирования. Разработанное компанией Nginx, Inc. (организация признана экстремистской и запрещена в РФ) как дополнение к веб-серверу NGINX, Unit представляет собой универсальную среду выполнения (application server), которая объединяет функции веб-сервера, сервера приложений и обратного прокси-сервера в одном процессе. Основная особенность Nginx Unit — динамическое управление конфигурацией без перезапуска сервера и поддержка одновременной работы приложений на разных языках (PHP, Python, Ruby, Go, Java, Node.js, Perl) в рамках одного инстанса.
История
Разработка Nginx Unit была начата в 2017 году командой NGINX под руководством Игоря Сысоева, создателя оригинального веб-сервера NGINX. Первая публичная бета-версия (0.1) была выпущена в сентябре 2017 года. Проект позиционировался как решение для современных микросервисных архитектур и контейнерных сред, где требуется быстрое развёртывание и масштабирование приложений без простоев.
В 2019 году, после приобретения компании NGINX корпорацией F5 Networks, разработка Unit продолжилась в рамках открытого сообщества. Ключевые версии:
- 1.0 (январь 2019) — первый стабильный релиз с поддержкой PHP, Python и Go.
- 1.11 (май 2020) — добавлена поддержка Java (через JAR-файлы) и улучшена работа с WebSocket.
- 1.21 (ноябрь 2021) — введена поддержка Node.js и Perl.
- 1.27 (июнь 2023) — добавлена поддержка протокола HTTP/3 (QUIC) и улучшена интеграция с NGINX.
По состоянию на 2024 год Nginx Unit остаётся активным проектом с открытым исходным кодом, распространяемым под лицензией Apache 2.0.
Архитектура и принцип работы
Модель процессов
Nginx Unit использует многопроцессную архитектуру, состоящую из двух основных компонентов:
- Главный процесс (master process) — отвечает за управление конфигурацией, мониторинг и координацию дочерних процессов.
- Процессы-обработчики (application processes) — изолированные процессы, каждый из которых выполняет код приложения на определённом языке. Количество процессов для каждого языка настраивается независимо.
Динамическая конфигурация
Конфигурация Nginx Unit задаётся в формате JSON и может быть изменена через REST API (по умолчанию на порту 8080) без перезапуска сервера. Это позволяет:
- Добавлять, удалять или обновлять приложения «на лету».
- Изменять параметры маршрутизации, SSL-сертификаты и настройки статики без прерывания обслуживания.
- Автоматизировать развёртывание через CI/CD-пайплайны.
Обработка запросов
- Входящий HTTP-запрос принимается главным процессом.
- На основе конфигурации маршрутизации (роутинга) запрос направляется к соответствующему приложению.
- Главный процесс передаёт запрос одному из свободных процессов-обработчиков нужного языка.
- После обработки ответ возвращается клиенту.
Поддерживаемые языки и среды выполнения
Nginx Unit поддерживает следующие языки программирования и их версии:
| Язык | Модуль | Поддерживаемые версии | Особенности |
|---|---|---|---|
| PHP | php | 7.4, 8.0, 8.1, 8.2 | Работа через FastCGI-протокол; поддержка PHP-FPM |
| Python | python | 3.6–3.11 | Поддержка WSGI (Flask, Django) и ASGI (FastAPI, Starlette) |
| Ruby | ruby | 2.5–3.2 | Поддержка Rack (Ruby on Rails, Sinatra) |
| Go | go | 1.16+ | Компилируемые приложения; запуск через HTTP-сервер |
| Java | java | 8, 11, 17 | Поддержка Servlet API (Tomcat, Jetty) через JAR-файлы |
| Node.js | node | 12, 14, 16, 18 | Поддержка Express.js, Koa, Fastify |
| Perl | perl | 5.26, 5.30, 5.32 | Поддержка PSGI (Mojolicious, Dancer) |
Ключевые возможности
Маршрутизация
Nginx Unit поддерживает гибкую систему маршрутизации на основе правил, задаваемых в JSON. Правила могут учитывать:
- HTTP-метод (GET, POST и т.д.)
- Путь URL (включая регулярные выражения)
- Заголовки запроса
- IP-адрес клиента
Пример конфигурации маршрутизации: ``json { "routes": [ { "match": { "uri": "/api/" }, "action": { "pass": "applications/api" } }, { "match": { "method": "GET", "uri": "/static/" }, "action": { "share": "/var/www/static$uri" } } ] } ``
Статические файлы
Nginx Unit может обслуживать статические файлы (HTML, CSS, JavaScript, изображения) без использования отдельного веб-сервера. Для этого используется директива share в конфигурации.
SSL/TLS
Поддерживается протокол HTTPS с использованием сертификатов в формате PEM. Сертификаты можно добавлять и обновлять через API без перезапуска.
Балансировка нагрузки
Unit может выступать в роли обратного прокси-сервера, распределяя запросы между несколькими бэкенд-серверами (например, для горизонтального масштабирования).
Логирование
Система ведёт журналы доступа (access log) и ошибок (error log) в формате, совместимом с NGINX. Поддерживается ротация логов.
Применение
Nginx Unit используется в следующих сценариях:
- Микросервисная архитектура — запуск нескольких приложений на разных языках в одном контейнере или виртуальной машине.
- DevOps и CI/CD — автоматическое развёртывание приложений через API без перезагрузки сервера.
- Образовательные и тестовые среды — быстрая смена конфигурации для отладки.
- Замена традиционных серверов приложений (Apache + mod_php, Gunicorn, Puma) в лёгких средах.
Сравнение с аналогами
| Характеристика | Nginx Unit | Apache + mod_php | Gunicorn (Python) | Puma (Ruby) |
|---|---|---|---|---|
| Динамическая конфигурация | Да (через API) | Нет (требуется перезагрузка) | Нет | Нет |
| Поддержка множества языков | Да (7 языков) | Только PHP | Только Python | Только Ruby |
| Использование памяти | Низкое | Среднее | Среднее | Среднее |
| Производительность | Высокая (асинхронная обработка) | Средняя | Высокая | Высокая |
| Простота настройки | Средняя (JSON-конфигурация) | Низкая (множество файлов) | Высокая | Высокая |
Ограничения
- Отсутствие поддержки Windows — Nginx Unit работает только в Unix-подобных системах (Linux, macOS, FreeBSD).
- Ограниченная документация — по сравнению с NGINX, документация Unit менее подробна.
- Отсутствие встроенной поддержки WebSocket (до версии 1.11) — для старых версий требуется отдельная настройка.
- Сложность отладки — из-за динамической конфигурации ошибки могут быть неочевидны.
Интересные факты
- Nginx Unit написан на языке C, что обеспечивает высокую производительность и низкое потребление памяти.
- Проект использует собственную реализацию HTTP-парсера, заимствованную из NGINX.
- В 2020 году Nginx Unit был интегрирован в официальный образ Docker-контейнера NGINX Unit, что упростило его использование в контейнерных средах.
- Название «Unit» отражает концепцию модульности — каждый язык работает как отдельный «юнит» (единица) в рамках одного процесса.
Источники
- Официальная документация Nginx Unit (nginx.org/en/docs/unit).
- Репозиторий проекта на GitHub (github.com/nginx/unit).
- Статья «Introducing NGINX Unit» (блог NGINX, 2017).
- Документация F5 Networks по NGINX Unit (techdocs.f5.com).
- Сравнительный анализ серверов приложений (журнал «Linux Journal», 2021).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →