Открыть сервис

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-пайплайны.

Обработка запросов

  1. Входящий HTTP-запрос принимается главным процессом.
  2. На основе конфигурации маршрутизации (роутинга) запрос направляется к соответствующему приложению.
  3. Главный процесс передаёт запрос одному из свободных процессов-обработчиков нужного языка.
  4. После обработки ответ возвращается клиенту.

Поддерживаемые языки и среды выполнения

Nginx Unit поддерживает следующие языки программирования и их версии:

ЯзыкМодульПоддерживаемые версииОсобенности
PHPphp7.4, 8.0, 8.1, 8.2Работа через FastCGI-протокол; поддержка PHP-FPM
Pythonpython3.6–3.11Поддержка WSGI (Flask, Django) и ASGI (FastAPI, Starlette)
Rubyruby2.5–3.2Поддержка Rack (Ruby on Rails, Sinatra)
Gogo1.16+Компилируемые приложения; запуск через HTTP-сервер
Javajava8, 11, 17Поддержка Servlet API (Tomcat, Jetty) через JAR-файлы
Node.jsnode12, 14, 16, 18Поддержка Express.js, Koa, Fastify
Perlperl5.26, 5.30, 5.32Поддержка PSGI (Mojolicious, Dancer)

Ключевые возможности

Маршрутизация

Nginx Unit поддерживает гибкую систему маршрутизации на основе правил, задаваемых в JSON. Правила могут учитывать:

Пример конфигурации маршрутизации: ``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 UnitApache + mod_phpGunicorn (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» отражает концепцию модульности — каждый язык работает как отдельный «юнит» (единица) в рамках одного процесса.

Источники

  1. Официальная документация Nginx Unit (nginx.org/en/docs/unit).
  2. Репозиторий проекта на GitHub (github.com/nginx/unit).
  3. Статья «Introducing NGINX Unit» (блог NGINX, 2017).
  4. Документация F5 Networks по NGINX Unit (techdocs.f5.com).
  5. Сравнительный анализ серверов приложений (журнал «Linux Journal», 2021).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →